0

Как я могу в NSOutlineView привязать к NSTreeController, управляемый NSXMLDocument, отображать только некоторые NSElements (одного типа), а не другие?Удалить NSElements с дисплея из NSOutlineView или NSTreeController

Благодаря

+0

TreeController - источник данных, поэтому вы должны убедиться, что содержимое treeController - это подмножество, которое вы хотите. Так что ты пробовал, что не работает? – stevesliva

+0

@stevesliva Я не хочу удалять элементы из содержимого. Я просто хочу, чтобы они не отображались. –

+0

Возможно, вам придется объяснить, почему ваш древовидный контроллер не может просто использовать подмножество и должен использовать все ... Это самый простой способ сделать это. Попытка реализовать функции делегата для проверки типа объекта получает hokey, потому что строки не могут быть 0 высотой и должны быть отображены – stevesliva

ответ

0

Чтобы скрыть некоторые элементы 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.

Смежные вопросы