2015-01-24 4 views
4

Код ниже работает, но, вероятно, лучший способ. Моя цель - вызывать функцию UIViewController из UITableCell при выходе из режима редактирования.Лучший способ связи между UITableViewCell и UIViewController

Я делаю это, установив экземпляр ссылки UIViewController на каждый UITableViewCell, а затем вызывая функцию CancelDelete() в изменении состояния UITableViewCell.

Код кажется неэффективным, так как для каждого MyCell я сначала создаю экземпляр MyViewContoller как общедоступную переменную, а затем заменяю его ссылкой на UIViewController при инициализации UITableView.

Есть ли лучший способ сделать это?

class MyCell : UITableViewCell 
{ 
    var previousState : UITableViewCellStateMask = UITableViewCellStateMask.allZeros 

    // This holds a reference to the parent view controller 
    // Seems wasteful to instantiate since it gets replaced 
    var controller:MyViewController = MyViewController() 

    // This is called when the user aborts edit mode 
    override func willTransitionToState(state: UITableViewCellStateMask) { 

     if state & UITableViewCellStateMask.ShowingEditControlMask != nil { 
      if previousState & UITableViewCellStateMask.ShowingDeleteConfirmationMask != nil { 

      // send notification to controller 
      controller.CancelDelete(self) 
     } 
    } 

    previousState = state 
    }  
} 


class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     // Give cell access to this controller       
     var cell:MyCell = tableView.dequeueReusableCellWithIdentifier("cell") as MyCell 
     cell.controller = self 
     cell.tag = indexPath.row 
    } 

    // This is called from the table cell 
    func CancelDelete(cell:MyCell) { 
      editButtons[cell.tag].hidden = false 
    } 

} 

ответ

2

Изменить тип controller к MyViewController! вместо MyViewController. Также установите значение по умолчанию nil.

Декларация controller должен выглядеть следующим образом:

var controller: MyViewController! = nil 

Если у вас есть какие-либо вопросы о типах, которые заканчиваются восклицательным знаком (!), обратите внимание на: https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html (в разделе имени OPTIONALS).

+1

Это сработало. Да, я все еще нуждаюсь в коррективном тренинге Swift. Это правильный метод общения? Я надеялся, что могу определить собственный ViewController из UITableViewCell, не указывая его явно. – billd

+0

Я не знаю, есть ли правильный путь, но это работает без необходимости иметь местозаполнитель. –

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