Делегат Swift set для self дает EXC плохой доступ

Я прохожу и изучаю Swift, перенося существующее приложение. Я застрял в настройке делегата и не могу понять, в чем проблема.

у меня есть класс, который расширяет UITableViewCell

import UIKit

protocol SwitchCellDelegate{
    func switchChanged(switchCell: SwitchCell, state: Bool)
}

class SwitchCell: UITableViewCell {

    @IBOutlet var swtSelector: UISwitch
    @IBOutlet var lblTitle: UILabel

    var delegate: SwitchCellDelegate?

    init(style: UITableViewCellStyle, reuseIdentifier: String) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    @IBAction func switchChanged(){
        delegate?.switchChanged(self, state: swtSelector.on)
    }

}

тогда в ViewController определяется как

class SettingsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, SwitchCellDelegate {

и в методе

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

у нас есть

case 2:
    storeCredentialsCell = tableView.dequeueReusableCellWithIdentifier("StoreCredentialsCell") as? SwitchCell
    if(storeCredentialsCell != nil){
        ...
        NSLog("Setting delegate to %@ for %@", self.description, storeCredentialsCell.description)
        storeCredentialsCell!.delegate = self
        ...
    }

выход журнала, как и ожидалось, но когда он попадает в фактическую настройку делегата, приложение аварийно завершает работу с

EXC_BAD_ACCESS (код=1, адрес=0xfffffffffffffffff8)

Я также должен отметить, что если я не устанавливаю значение делегата при делегировании?.switchChanged (self, состояние: swtSelector.on) срабатывает, это также вызывает ошибку EXC_BAD_ACCESS, но согласно doco для делегатов это должно произойти изящно, если делегат не установлен ни на что.

===========================

я упростил до базового проекта для репликации вопрос.

TestTableViewController.Свифт!--7-->

import UIKit

class TestTableViewController: UITableViewController, TestCellDelegate {

    init(style: UITableViewStyle) {
        super.init(style: style)
    }

    init(coder aDecoder: NSCoder!) {
        super.init(coder: aDecoder)
    }

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

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

    override func numberOfSectionsInTableView(tableView: UITableView?) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell? {
        let cell = tableView!.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as? TestCell

        if(cell != nil){
            cell!.delegate = self
            cell!.lblTest.text = "Test Successful"
        }

        return cell
    }

    func eventFired(sender: TestCell) {
        NSLog("Hooray!")
    }

TestCell.Свифт!--7-->

import UIKit

protocol TestCellDelegate{
    func eventFired(sender: TestCell)
}

class TestCell: UITableViewCell {

    @IBOutlet var lblTest: UILabel
    @IBOutlet var swtTest: UISwitch

    var delegate: TestCellDelegate?

    init(style: UITableViewCellStyle, reuseIdentifier: String) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    @IBAction func switchChanged(sender: UISwitch){
        delegate?.eventFired(self)
    }
}

затем я создал одну сцену контроллера представления таблицы с классом TestTableViewController. Вид таблицы динамические с одну ячейку TestCell типа. Эта ячейка содержит одну метку и один переключатель, которые привязаны к IBOutlets из класса TestCell. Функция switchChanged привязана к событию изменения значения на коммутаторе.

тот же EXC_BAD_ACCESS ошибка.

2 ответов


В настоящее время вы должны явно пометить свои протоколы с @objc если делегат должен быть объектом класса Objective-C (например, UITableViewController):

@objc protocol SwiftProtocol

Это позволит взаимодействовать с Objective-C


а теперь о решении....

@objc protocol SwitchCellDelegate

вместо

protocol SwitchCellDelegate