Swift set delegate to self gives EXC_BAD_ACCESS -


i'm going through , learning swift porting existing application. i'm stuck on setting delegate , cannot work out issue is.

i have class extends 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)     }  } 

then in viewcontroller defined

class settingsviewcontroller: uiviewcontroller, uitableviewdelegate, uitableviewdatasource, switchcelldelegate { 

and within method

func tableview(tableview: uitableview!, cellforrowatindexpath indexpath: nsindexpath!) -> uitableviewcell! { 

we have

case 2:     storecredentialscell = tableview.dequeuereusablecellwithidentifier("storecredentialscell") as? switchcell     if(storecredentialscell != nil){         ...         nslog("setting delegate %@ %@", self.description, storecredentialscell.description)         storecredentialscell!.delegate = self         ...     } 

the log output expected when hits actual setting of delegate app crashes with

exc_bad_access(code=1, address=0xfffffffffffffff8)

i should note if don't set delegate value when delegate?.switchchanged(self, state: swtselector.on) fires causes exc_bad_access error according doco delegates should fail gracefully if delegate not set anything.

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

i've simplified down basic project replicate issue.

testtableviewcontroller.swift

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.swift

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)     } } 

i created single table view controller scene class of testtableviewcontroller. table view dynamic single cell of type testcell. cell contains 1 label , 1 switch bound iboutlets testcell class. switchchanged function bound value changed event on switch.

same exc_bad_access error thrown.

currently have explicitly mark protocols @objc if delegate should object of objective-c class (like uitableviewcontroller):

@objc protocol swiftprotocol 

this enable interoperating objective-c


Comments

Popular posts from this blog

database - VFP Grid + SQL server 2008 - grid not showing correctly -

jquery - Set jPicker field to empty value -

.htaccess - htaccess convert request to clean url and add slash at the end of the url -