NSOutlineView не сворачивает элемент

У меня есть NSOutlineView, и нажатие на строку развернет/свернет элемент, если он расширяемый.

    if ([self.outlineView isItemExpanded:item]) {
        NSLog("Will collapse item : %@", item);
        [[self.outlineView animator] collapseItem:item];
    }
    else {
        [[self.outlineView animator] expandItem:item];
    }

Расширение элемента работает должным образом, однако свертывание элемента не работает. Я получил журнал перед выполнением rollItem:, и элемент правильный. Метод делегата - (BOOL)outlineView:(NSOutlineView *)outlineView shouldCollapseItem:(id)item тоже не вызывался.

Были на этой проблеме в течение нескольких часов. Любые идеи, что вызывает это?


person Jensen    schedule 19.06.2013    source источник


Ответы (4)


Я понял. Кажется, что элемент можно свернуть только тогда, когда - (BOOL)outlineView:(NSOutlineView *)outlineView shouldShowOutlineCellForItem:(id)item возвращает YES для этого элемента. В противном случае вы можете только расширить элемент.

person Jensen    schedule 19.06.2013
comment
Спасибо за публикацию. У меня такая же проблема. Кажется странным, что он может только расширяться. Придется применять другой подход... - person Giles; 10.04.2018

В моем случае моим элементом является struct, поэтому эта функция не работает. Затем мне нужно перейти на class, и это сработало. Потому что, когда я использую этот код «let item = layoutView.item(atRow: selectedIndex)» в struct, он скопирует значение и создаст новый объект. Таким образом, схема просмотра не может распознать элемент => это не сработает.

    let selectedIndex = outlineView.selectedRow
    if let item = outlineView.item(atRow: selectedIndex) {
        if outlineView.isItemExpanded(item) {
            outlineView.collapseItem(item, collapseChildren: true)
        }else {
            outlineView.expandItem(item, expandChildren: true)
        }
    }
person Heo Đất Hades    schedule 06.12.2017

Это работает очень хорошо для меня

id item = [sender itemAtRow:[sender clickedRow]];
if ([self outlineView:sender isItemExpandable:item]) {
    if ([sender isItemExpanded:item])
        [sender collapseItem:item];
    else
        [sender expandItem:item];
}
person Thomas    schedule 25.02.2015

Элемент NSOutlineView будет свернут или нет, зависит от метода ниже, верните true, если вы хотите свернуть, иначе false.

func outlineView(_ outlineView: NSOutlineView, shouldShowOutlineCellForItem item: Any) -> Bool

Я попытался сделать такую ​​же демонстрацию, как системные настройки MAC -> клавиатура -> ярлыки введите описание изображения здесь< /а>

func outlineView(_ outlineView: NSOutlineView, shouldShowOutlineCellForItem item: Any) -> Bool {

    let isExpanded = outlineView.isItemExpanded(item)

    if isExpanded {

        return true

    } else {

        return false
    }
}

func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {

    let view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "OutlineTableCell"), owner: self) as! OutlineTableCell

    view.setOutlineTableCellLaytout(forNode: (item as? SectionTreeNode)!)

    view.disclosure.action = nil

    view.disclosure.action = #selector(didDisclosureClicked(_:))

    view.selectedItem = item as? SectionTreeNode

    return view

}

@objc func didDisclosureClicked(_ sender: NSButton) {

    let view = sender.superview?.superview as? OutlineTableCell

    let isExpand = outlineView.isItemExpanded(view?.selectedItem)

    isExpand ? outlineView.collapseItem(view?.selectedItem, collapseChildren: true) : outlineView.expandItem(view?.selectedItem, expandChildren: true)

}

Мой вывод показан ниже: введите здесь описание изображения

person user7167475    schedule 28.04.2018