Делегат 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