2016-07-28 2 views
0

Я создаю представление для доступа к настройкам в приложении, которое будет представлено в UITableView. Некоторые клетки будут иметь UITableViewCellAccessoryDisclosureIndicator, мне нужен с UISwitch, а другой с UISegmentedControl вроде этого:Как использовать разные стили ячеек в UITableView

enter image description here

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

Созданы три UITableViewCell класса:

class DisclosureCell: UITableViewCell { 
    override func awakeFromNib() { 
    super.awakeFromNib() 
    } 

    override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 

    // Configure the view for the selected state 
    } 

    class func defaultIdentifier() -> String { 
    return NSStringFromClass(self) 
    } 

} 

class SegmentedControlCell: UITableViewCell { 

    override func awakeFromNib() { 
    super.awakeFromNib() 
    } 

    override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 

    // Configure the view for the selected state 
    } 

class func defaultIdentifier() -> String { 
    return NSStringFromClass(self) 
    } 

} 

class SwitchCell: UITableViewCell { 

    override func awakeFromNib() { 
    super.awakeFromNib() 
    } 

    override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 

    // Configure the view for the selected state 
    } 

    class func defaultIdentifier() -> String { 
    return NSStringFromClass(self) 
    } 

} 

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

class SettingsData { 

    func getSectionsFromData() -> [Section] { 

    var settings = [Section]() 

    let preferences = Section(title: "OPTIONS", objects: ["Formulas", "Lifts", "Units", "Allow 15 reps"]) 
    let patronFeatures = Section(title: "PATRON FEATURES", objects: ["Support OneRepMax"]) 
    let feedback = Section(title: "FEEDBACK", objects: ["Send Feedback", "Please Rate OneRepMax"]) 

    settings.append(preferences) 
    settings.append(patronFeatures) 
    settings.append(feedback) 

    return settings 
    } 
} 

struct Section { 
    var sectionHeading: String 
    var items: [String] 

    init(title: String, objects: [String]) { 
    sectionHeading = title 
    items = objects 

    } 

} 

Наконец, мой UITableViewController:

class SettingsViewController: UITableViewController { 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    self.navigationController?.navigationBar.topItem?.title = "Settings" 

    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: #selector(self.dismissSettings(_:))) 

    } 

    func dismissSettings(sender: AnyObject?) { 
    self.dismissViewControllerAnimated(true, completion: nil) 

    } 

    // MARK: - Table view data source 

    var sections: [Section] = SettingsData().getSectionsFromData() 

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

    } 

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

    } 

    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    return sections[section].sectionHeading 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("DisclosureCell", forIndexPath: indexPath) 
    cell.textLabel?.text = sections[indexPath.section].items[indexPath.row] 

    return cell 

    } 

Я думаю, что т мне нужна помощь с:

  • Как я создаю каждую клетку, как определить, какой из трех моих типов каждая клетка таким образом я могу отобразить их в зависимости от типа, а также Dequeue каждого типа правильно
  • I создал func defaultIdentifier() -> String в каждом пользовательском классе И указал идентификаторы повторного использования в раскадровке для каждого типа ячейки. Нужно ли мне обоим?
  • Мне нужно зарегистрировать эти ячейки или это не нужно, потому что я использую раскадровку?

Я нашел много потоков по этому предмету, но либо они находятся в Objective-C, и/или они не говорят с конкретными частями, на которые я, похоже, застрял.

Спасибо!

UPDATE:

Я обновил мой override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell следующим образом:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cellIdentifier = tableView.cellForRowAtIndexPath(indexPath)?.reuseIdentifier 
    if cellIdentifier == "DisclosureCell" { 
     let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "DisclosureCell") 
     cell.textLabel?.text = sections[indexPath.section].items[indexPath.row] 

     return cell 

    } else if cellIdentifier == "SegmentedControlCell" { 
     let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "SegmentedControlCell") 
     cell.textLabel?.text = sections[indexPath.section].items[indexPath.row] 

     return cell 
    } 
     else { 
      let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "SwitchCell") 
      cell.textLabel?.text = sections[indexPath.section].items[indexPath.row] 

     return cell 
     } 
    } 

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

2016-07-28 07: 15: 35,894 Один Rep Макс [982: 88043] Нагрузочного приложение из-за неперехваченное исключение «NSRangeExcept ион», причина:" - [__ NSArrayI objectAtIndex]: индекс 2 за пределами [0 .. 0]

И мне нужно, чтобы выяснить способ для каждой ячейки, чтобы узнать, какой из трех типов он СЛЕДУЕТ быть, тогда, основываясь на том, какой тип он есть, я могу настроить его в коде выше.

UPDATE 2 Я теперь получил это вид работы, используя indexPath.row:

enter image description here

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("CustomTableViewCell", forIndexPath: indexPath) as! CustomTableViewCell 
    if indexPath.row == 0 { 
     cell.selectionStyle = .None 
     cell.textLabel!.text = sections[indexPath.section].items[indexPath.row] 
     cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator 
     return cell 

    } else if indexPath.row == 1 { 
     cell.selectionStyle = .None 
     cell.textLabel!.text = sections[indexPath.section].items[indexPath.row] 
     //cell.accessoryView = useAuthenticationSwitch 
     let switchView: UISwitch = UISwitch() 
     cell.accessoryView = switchView 
     switchView.setOn(false, animated: false) 
     return cell 

    } else { 
     cell.selectionStyle = .None 
     cell.textLabel!.text = sections[indexPath.section].items[indexPath.row] 
     let segmentedControl: UISegmentedControl = UISegmentedControl(items: ["lbs", "kg"]) 
     segmentedControl.selectedSegmentIndex = 0 
     segmentedControl.addTarget(self, action: nil, forControlEvents: .ValueChanged) 
     cell.accessoryView = segmentedControl 
     return cell 

    } 
    } 

Проблема заключается в том, что с помощью indexPath.row, не все строки имеют правильный accessoryView. В приведенном выше примере я хочу, чтобы первые две строки имели disclosureIndicators, третий - UISegmentedControl, а четвертый - UISwitch. Теперь, я полностью понимаю, почему мой код производит это - это потому, что accessoryView определяется положением ячейки. Вместо этого я хочу сказать каждую ячейку, когда она создается: «Вы - ячейка для этой настройки, поэтому вы получаете [заполнение пробела] accessoryView». У меня есть пользовательские классы ячеек, созданные для каждого типа, и пытались сделать то, что я пытаюсь сделать с ними, но не могли понять. Вы можете заметить, что в приведенном выше коде я перешел к одному пользовательскому классу ячеек и повторному использованию идентификатора.

Я полагаю, что мог бы делать такие вещи, как if indexPath.row == 0 | 1 { blah, blah }, но этот подход не будет задерживаться через каждые section. Если я попытаюсь разобраться с каждым section, то этот код станет более грязным, чем он есть. Должен быть умнее.

Есть ли?

+0

Посмотрите на мой ответ на аналогичный вопрос здесь: http://stackoverflow.com/questions/38565089/multiple-cutsom-cells-in-uitableview/38565553#38565553. Ответ в объективе c, но это даст вам представление о том, как достичь того, что вы ищете. Вы можете легко реализовать его в Swift. –

+0

Одиночная ячейка достаточно –

+0

Я не очень разбираюсь в TableView. Но я думаю, что это поможет вам. выберите tableViewController из раскадровки и перейдите к инспектору атрибутов, а затем увеличьте количество ячеек прототипа столько, сколько захотите, а затем настройте ячейку tableView в соответствии с вашим требованием. –

ответ

0

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

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