2017-02-14 3 views
0

Я хочу создать приложение для навигации по иерархии данных. Я консультировался с этой страницей Drill-down Hierarchical UITableView и не знаю, как реализовать структуру узлов с помощью xml для ее реализации. Я пытаюсь избежать создания 100 табличных контроллеров и т. Д. По моему мнению, до сих пор я считаю, что мне нужно использовать узлы. После того, как я проснулся полностью, мне нужно будет использовать другой диспетчер представлений, но я считаю, что понимаю, как это сделать.Swift - сверлить иерархические данные с помощью UITableView

Вот мини-пример моего XML-файла. Я могу внести в него изменения, если это необходимо, чтобы сделать работу.

<hnt> 
    <face> 
     <action id="1"> 
      <name>Occipitofrontalis</name> 
      <type>data</type> 
      <description>data</description> 
     </action> 
    </face> 
    <temporoman> 
     <mandibulardep> 
      <action id="1"> 
       <name>Occipitofrontalis</name> 
       <type>data</type> 
       <description>data</description> 
      </action> 
      <action id="2"> 
       <name>Occipitofrontalis</name> 
       <type>data</type> 
       <description>data</description> 
      </action> 
     </mandibulardep> 
    </temporoman> 
</hnt> 

<face> 
</face> 

Я использую этот код для анализа моего xml-файла. Я не уверен, как распечатать образец.

override func viewDidLoad() { 
    super.viewDidLoad() 

    if let path = Bundle.main.url(forResource: "01 - MainCategories", withExtension: "xml") { 
     if let parser = XMLParser(contentsOf: path) { 
      parser.delegate = self 
      parser.parse() 
     } 
    } 
} 

func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) { 
    eName = elementName 
    if elementName == "mainCat" { 
     mainCategoriesTitle = String() 
    } 
} 


func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 
    if elementName == "mainCat" { 

     let mCat = MainCategories() 
     mCat.mainCategoriesTitle = mainCategoriesTitle 

     mainCat.append(mCat) 
    } 
} 


func parser(_ parser: XMLParser, foundCharacters string: String) { 
    let data = string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) 

    if (!data.isEmpty) { 
     if eName == "title" { 
      mainCategoriesTitle += data 
     } 
    } 
} 
+0

Можете ли вы представить небольшой репрезентативный образец xml? Вы еще разобрали его? Пожалуйста, покажите структуру, испущенную из разбора. – danh

+0

Вы можете повторно использовать один и тот же контроллер представления и нажимать его вручную, если структура подобна для каждого узла. –

+0

@danh Я обновил свой вопрос с помощью некоторого кода и образца xml. – Number1

ответ

0

Похоже, что парсер надеется создать иерархию категорий. (Я не вижу ничего подходящего в примере xml, но я предполагаю, что он есть).

Первое, что необходимо, это древовидный объект Category. В простейшем случае это подкласс NSObject, который имеет name и массив дочерних элементов, который, что важно, - это массив из Category.

Метод класса в категории может выполнять синтаксический анализ xml. Основным контуром анализа xml в древовидной структуре является:

  • на исходном документе, создайте корень. сделать его текущим узлом.
  • на стартовом элементе, создайте ребенка. установите его родительский узел в текущий узел. сделать дочерний узел текущим.
  • нахождение чего-либо еще (например, символов), задание свойств на текущем узле.
  • на конце элемент, сделать родитель текущего узла текущего узла.
  • на конечном документе, все готово.

Это дерево - это дерево, о котором говорится в другом вопросе. Вся идея возможна только в том случае, если у вас есть древовидная структура и представление текущего узла (или текущей категории), который просматривается.

+0

Вы объясняете, что делает парсер или что мне нужно для доступа к данным? – Number1

+0

Я объясняю, что должен делать ваш парсер. Он должен создать иерархическую модель. Я также объясню, какова должна быть иерархическая модель (минимально): объект с некоторыми данными, например «имя», и массив дочерних элементов, которые являются тем же классом, что и их родитель. – danh

+0

Если вы можете создать иерархическую модель из xml, вы можете использовать эту модель в ответе на другой вопрос. «node» в этом контексте - это только текущая позиция в модели (категории), просматриваемая пользователем. В представлении таблицы в этом другом вопросе перечислены дочерние категории (дочерние категории) текущего узла. – danh

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