2016-06-11 3 views
0

В моем представлении таблицы есть возможность выбора нескольких ячеек, где каждая ячейка устанавливает себя как выбранную при нажатии кнопки внутри ячейки (как это делает приложение gmail, см. Рисунок ниже). Я ищу способ сообщить UITableViewController, что ячейки были выбраны или отменены, чтобы вручную изменить UINavigationItem. Я надеялся, что есть способ сделать это, используя методы делегата, но я не могу найти его. didSelectRowAtIndexPath обрабатывает клики на самой ячейке и не должен влиять на выбранное состояние ячейки.Уведомлять UITableViewController, когда ячейка запрограммирована программно

enter image description here

ответ

3

Самый прямой способ сделать это было бы создать свой собственный делегат для клетки, что ваш UITableViewController бы принять. Когда вы деактивируете свою ячейку, вы также установили бы свойство delegate на ячейку на экземпляр UITableViewController. Затем ячейка может вызывать методы в вашем , чтобы сообщить UITableViewController о действиях, которые происходят, и при необходимости может обновить другое состояние. Вот пример кода, чтобы дать представление (обратите внимание, что я не запускаю это компилятором, так что может быть опечаток):

protocol ArticleCellDelegate { 
    func articleCellDidBecomeSelected(articleCell: ArticleCell) 
    func articleCellDidBecomeUnselected(articleCell: ArticleCell) 
} 

class ArticleCell: UICollectionViewCell { 
    @IBAction private func select(sender: AnyObject) { 
     articleSelected = !articleSelected 

     // Other work 

     if articleSelected { 
      delegate?.articleCellDidBecomeSelected(self) 
     } 
     else { 
      delegate?.articleCellDidBecomeUnselected(self) 
     } 
    } 

    var articleSelected = false 
    weak var delegate: ArticleCellDelegate? 
} 

class ArticleTableViewController: UITableViewController, ArticleCellDelegate { 
    func articleCellDidBecomeSelected(articleCell: ArticleCell) { 
     // Update state as appropriate 
    } 

    func articleCellDidBecomeUnselected(articleCell: ArticleCell) { 
     // Update state as appropriate 
    } 

    // Other methods ... 

    override tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueCellWithIdentifier("ArticleCell", forIndexPath: indexPath) as! ArticleCell 
     cell.delegate = self 

     // Other configuration 

     return cell 
    } 
} 
1

Я бы иметь функцию, как «cellButtomDidSelect» в контроллере представления и в ' cellForRowAtIndexPath ', установить целевое действие на вышеупомянутую функцию