2016-10-12 6 views
0

У меня есть UITableView, в котором есть строки, которые включают в себя две кнопки UISwitch. Пока я не повышен до Xcode8 он работал со мной добавление протокола к контроллеру представления, как этотКак добавить событие в мой CustomCell в Swift3

protocol CustomCellDelegator { 
    func callSegueFromCell() 
} 

Затем я добавил следующее к моему CustomCell быстрому файлу, который обрабатывает выходные отверстия для моей пользовательской ячейки.

open class CustomTableViewCell: UITableViewCell { 
    var delegate:CustomCellDelegator! 

    @IBOutlet weak var uidLabel: UILabel! 
    @IBOutlet weak var stateLabel: UILabel! 
    @IBOutlet weak var operatedSwitch: UISwitch! 
    @IBOutlet weak var switchRTN: UISwitch! 

    override open func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

    @IBAction func operatedSwitchChange() { 
     if operatedSwitch.isOn { 
      AppDelegate.myGlobalVars.gSwitchType = "OpsOn" 
     } 
     else { 
      AppDelegate.myGlobalVars.gSwitchType = "OpsOff" 
     } 
     if(self.delegate != nil){ //Just to be safe. 
      self.delegate.callSegueFromCell() 
     } 
    } 

    @IBAction func rtnSwitchChange() { 
     if switchRTN.isOn { 
      AppDelegate.myGlobalVars.gSwitchType = "RtnOn" 
     } 
     else { 
      AppDelegate.myGlobalVars.gSwitchType = "RtnOff" 
     } 
     if(self.delegate != nil){ //Just to be safe. 
      self.delegate.callSegueFromCell() 
     } 
    } 
} 

Пока я не модернизировал это работало и делегат всегда имел значение, теперь она всегда ноль и переход никогда не вызывается.

Что мне нужно делать по-другому, так как я обновился, чтобы снова работать?

+0

Вы можете показать относительные части вашего View Controller, который содержит код, который устанавливает и соответствует делегату? – ezcoding

+0

Я знаю, что мне нужно назначить делегата моей ячейке (cell.delegate =?) В cellForRowAtIndexPath, но я не могу заставить его работать как cell.delegate = CustomCellDelegator выдает ошибку, как это имеет тип CustomCellDelegator.protocol. Есть идеи? – user616076

+0

См. Мой ответ ниже. Вы предоставляете другой класс или тип, соответствующий протоколу. Это должен быть экземпляр чего-то, чтобы вы могли выполнить с ним любой код. – ezcoding

ответ

0

Убедитесь, что вы присвоили свой делегат в ViewController:

// Make your ViewController conform to the protocol 
class MyViewController: CustomCellDelegator { 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell: CustomTableViewCell = tableView.dequeueReusableCellWithIdentifier("MyCellIdentifier", forIndexPath: indexPath) as! CustomTableViewCell    
     cell.delegate = self 

     return cell 
    } 

    func callSegueFromCell() { 
     // perform your segue here 
    } 
} 
+0

Спасибо, добавив CustomCellDelegator в мой делегат ViewController, помог мне назначить мой cell.delegate = self. – user616076

+0

Добро пожаловать :) – ezcoding

0

Убедитесь, что вы назначили своего делегата в ячейке cellForRowAtIndexPath. Кроме того, я бы рекомендовал оставить ссылку weak делегату.

protocol CustomCellDelegator: class { 
    func callSegueFromCell() 
} 

В вашем CustomTableViewCell заменить

var delegate:CustomCellDelegator! 

с

weak var delegate: CustomCellDelegator? 

После этого вам не нужно, чтобы проверить, если ваш делегат nil или нет, ваше приложение не будет врезаться.

+0

Спасибо за ответ, я внес эти изменения, но делегат по-прежнему ноль – user616076

+0

показать нам, где вы назначаете делегата своей ячейке. – dirtydanee

+0

На данный момент я не являюсь тем, кого вы считаете правильным, это проблема. Я пробовал cell.delegate = CustomCellDelegator, который терпит неудачу, потому что он имеет тип CustomCellDelegator.protocol. Как назначить делегата? – user616076