2016-03-06 3 views
0

Я не уверен, что я делаю лучший дизайн здесь ...Подсчет количества структур, вложенных в другую структуру?

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

struct Chapter1 { 
    struct Category1{ 
     let name = "#1" 
     let content = "Lorem Ipsum" 
    } 

    struct Category2{ 
     let name = "#2" 
     let content = "Lorem Ipsum Ipsum" 
    } 

    struct Category3{ 
     let name = "#3" 
     let content = "Ipsum Lorem Ipsum" 
    } 
} 

Теперь проблема, я хочу, чтобы вернуть номер категории в numberOfSectionsInTableView. Как я могу их сосчитать? Есть ли способ? Или, может быть, мой дизайн неправильный?

И тогда мне нужно передать имя структуры через segue ... Возможно ли это?

На данный момент решение, которое я нашел, очень неэлегантно. В структуре Chapter1 я помещаю массив с «Категория1», «Категория2» и т. Д. Это не оптимально! И я не нашел решение, чтобы сделать это:

var x = "Category1" 
var nameOfTheSelectedCategory = Chapter1.x.name 

Даже не знаю, если это возможно, но это может быть решение ... Я также попытался с помощью переключателя, но у меня такая же проблема ...

Спасибо!

ответ

3

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

Вот типы вам нужно:

struct Chapter { 
    let categories: [Category] 
} 

struct Category { 
    let name: String 
    let content: String 
} 

А вот значение массив, содержащий одно значение типа Chapter, который содержит три значения типа Category:

let chapters: [Chapter] = [ 
    Chapter(categories: [ 
     Category(name: "Data Structures", content: "structs, classes, enums, tuples, etc."), 
     Category(name: "Algorithms", content: "sorting, searching, calculating, etc."), 
     Category(name: "Programs", content: "Flappy Bird, Microsoft Word, etc."), 
    ]) 
] 

Вы можете определить ваш таблица вид источник данных, подобный этому:

class MyDataSource: NSObject, UITableViewDataSource { 

    let chapters: [Chapter] = [ 
     Chapter(categories: [ 
      Category(name: "Data Structures", content: "structs, classes, enums, tuples, etc."), 
      Category(name: "Algorithms", content: "sorting, searching, calculating, etc."), 
      Category(name: "Programs", content: "Flappy Bird, Microsoft Word, etc."), 
      ]) 
    ] 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return chapters.count 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return chapters[section].categories.count 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("CategoryCell", forIndexPath: indexPath) as! CategoryCell 
     let category = chapters[indexPath.section].categories[indexPath.row] 
     cell.category = category 
     return cell 
    } 

} 

Если segue подключен из ячейки в раскадровке, то сама ячейка является отправителем, поэтому вы можете обрабатывать ее так:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "CategoryDetail" { 
      let cell = sender as! CategoryCell 
      let categoryDetailViewController = segue.destinationViewController as! CategoryDetailViewController 
      categoryDetailViewController.category = cell.category 
     } 
    } 
+0

Приятно! Пойдем так! – petaire

0

Я думаю, вы должны рассмотреть вопрос о приближении к модели данных немного по-другому, взглянуть на делать что-то вроде этого

class Chapter { 
    let name: String 
    var sections: [Category] 

    init(name: String, sections: [Category]){ 
     self.name = name 
     self.sections = sections 
    } 
} 
struct Category { 
    let name: String 
    let content: String 
} 

var newChapter = Chapter(name: "One", sections: [Category(name: "#1", content: "Lorem Ipsum")]) 

newChapter.sections.append(Category(name: "#2", content: "Test")) 

Вы можете дополнительно расширить модель, если вам нужно поддерживать несколько глав, сделав self.data = [Chapter], а затем в numberOfSectionsInTableView возвращение self.data.count и в numberOfRowsInSection возвращение self.data[section].sections.count.

+0

Спасибо! Роб был быстрее (вот что она сказала!) – petaire

+0

Uh Я был на 6 минут быстрее lol. – sschale

+0

О да, вы правы! Сожалею! – petaire

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