Как я могу в NSOutlineView привязать к NSTreeController, управляемый NSXMLDocument, отображать только некоторые NSElements (одного типа), а не другие?Удалить NSElements с дисплея из NSOutlineView или NSTreeController
Благодаря
Как я могу в NSOutlineView привязать к NSTreeController, управляемый NSXMLDocument, отображать только некоторые NSElements (одного типа), а не другие?Удалить NSElements с дисплея из NSOutlineView или NSTreeController
Благодаря
Чтобы скрыть некоторые элементы NSXMLElement
должны быть подклассы. Цель это проверить, если один из детей элемента, это один из тех, которые будут скрыты и удалить его из children
массива:
class ICoderElement:NSXMLElement{
///List of elements names to remove
let nodeElementsNamesToRemove = ["title", "code"]
override var children: [AnyObject]? {
//get the array with all the children
var superChildren = super.children
//Cast the array of children to its true self
if var trueSuperChildren = superChildren as? [NSXMLNode] {
//Test if the array isn't empty to don't iterate over it
if trueSuperChildren.count > 0 {
//Iterate each of them
for var index = 0; index < trueSuperChildren.count; index++ {
let node = trueSuperChildren[index]
//If any it's of NSXMLElement class unwarps it's name and...
if let nodeElement = node as? NSXMLElement, let nodeName = nodeElement.name {
//..tests if it's name it's o the list of elements to remove
//change to nodeElementsNamesToRemove.contains(nodeName) in swift2
if contains(nodeElementsNamesToRemove, nodeName) {
//Remove the child NSXMLElement from the array
trueSuperChildren.removeAtIndex(index)
//reduce the index as the array 1 less element
index = index - 1
}
}
}
}
//returns the array without the selected elements
return trueSuperChildren
}
return superChildren
}
}
Для использования этого класса NSXMLDocument
также быть подклассы, чтобы он мог заменен NSXMLElement
:
class ICoderXMLDocument:NSXMLDocument {
override class func replacementClassForClass(cls: AnyClass) -> AnyClass! {
//Replace NSXMLElement by ICoderElement
if cls === NSXMLElement.self {
return ICoderElement.self
}
return cls
}
}
Теперь childCount
следует использовать с осторожностью. Он все равно вернет количество дочерних узлов из файла XML.
Поскольку эти элементы скрыты, все еще могут быть такие функции, как elementsForName
.
TreeController - источник данных, поэтому вы должны убедиться, что содержимое treeController - это подмножество, которое вы хотите. Так что ты пробовал, что не работает? – stevesliva
@stevesliva Я не хочу удалять элементы из содержимого. Я просто хочу, чтобы они не отображались. –
Возможно, вам придется объяснить, почему ваш древовидный контроллер не может просто использовать подмножество и должен использовать все ... Это самый простой способ сделать это. Попытка реализовать функции делегата для проверки типа объекта получает hokey, потому что строки не могут быть 0 высотой и должны быть отображены – stevesliva