2016-08-25 3 views
0

Я создаю приложение, где у меня есть несколько разделов в UITableView. Мое текущее решение собирает мои данные в словаре, а затем выбирает один ключ для каждого раздела. Есть ли лучшее решение?Лучший способ заполнить строки в разделе в UITableView?

+0

1) Нет секций = нет ключей в словаре 2) Нет строк в разделе = нет значений в словаре по индексу (раздел) – pkc456

+0

Точно так и это способ сделать это? – Recusiwe

+0

Да, это правильный путь. Должен ли я поделиться этим кодом? – pkc456

ответ

0

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

Вы можете сделать это со словарем, так как вы можете перебирать его содержимое.

Надеется, что это помогает:

class AwesomeTable: UITableViewController { 

    private var tableContent: [[String]] = [["Section 1, row 1", "Section 1, row 2"], ["Section 2, row 1", "Section 2, row 2"]] 

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

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

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) 

     let item = tableContent[indexPath.section][indexPath.row] 

     cell.textLabel?.text = item 

     return cell 
    } 

} 
+0

Это не очень хорошая практика. 1). В больших масштабах очень сложно поддерживать содержание этого словаря. 2). Практически невозможно сортировать или заказывать большие словари. 3). Очень сложно создавать очень сложные клетки 4). Если у вас более 1 или 2 типа клеток, это становится бесполезным в вашей ячейкеForRowAtIndexPath 5). Ничто не установлено явно. Вы только реле на правильном содержании словаря, что не хорошо. –

+0

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

2

Один из хороших способов к ней - прямому отображение модели, особенно хорошо с быстрыми перечислениями. Например, у вас есть 2 разных раздела с тремя типами строк. Ваш код перечисления и ViewController будет выглядеть так:

enum TableViewSectionTypes { 
    case SectionOne 
    case SectionTwo 
} 

enum TableViewRowTypes { 
    case RawTypeOne 
    case RawTypeTwo 
    case RawTypeThreeWithAssociatedModel(ModelForRowTypeNumberThree) 
} 

struct ModelForRowTypeNumberThree { 
    let paramOne: String 
    let paramTwo: UIImage 
    let paramThree: String 
    let paramFour: NSData 
} 

struct TableViewSection { 
    let type: TableViewSectionTypes 
    let raws: [TableViewRowTypes] 
} 

class ViewController: UIViewController, UITableViewDataSource { 

    var sections = [TableViewSection]() 

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

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let raw = sections[indexPath.section].raws[indexPath.row] 
     switch raw { 
     case .RawTypeOne: 
      // Here return cell of first type 
     case .RawTypeTwo: 
      // There return cell of second type 
     case .RawTypeThreeWithAssociatedModel(let modelForRawTypeThree): 
      // And finally here you can use your model and bind it to your cell and return it 
     } 
    } 
} 

Какие преимущества? Сильная типизация, явное моделирование и явная обработка различных типов ячеек. Единственное, что вам нужно сделать в этом сценарии, - это проанализировать ваши данные в этих перечислениях и структурах, а также сделать это для ваших словарей.

+0

Это кажется очень перспективным для решения моей проблемы. Однако я не могу понять, как разбирать эти данные из базы данных firebase в перечисление. Могу ли я просто загрузить данные из моей базы данных непосредственно в перечисление? Или где я могу выполнить этот шаг? У меня уже есть структура как ModelForRowTypeNumberThree в моей. В моем приложении все строки будут одинаковыми, но заполнены 4 различными NSDictionarys. Это возможно? – AlexVilla147

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