Friday 15 May 2015

ios - Swift Selector outside ViewControl -



ios - Swift Selector outside ViewControl -

i have viewcontroller , view :

class graphicviewcontroller: uiviewcontroller { var timervc!:nstimer override func viewdidload() { (view graphicview).timerv = nstimer.scheduledtimerwithtimeinterval(interval, target: self, selector: selector("dosomework"), userinfo: nil, repeats: true) } } class graphicview: uiview { var timerv:nstimer! func dosomework(someparam:nsstring)->double {/*code*/} }

it causes error wrong selector. have 2 questions:

1) how utilize selector arguments , returning func?

2) how take func view instead avoiding creating such func in vc?

the reason why error triggered not providing right target. that's how target-action paradigm works (or @ least, how works in objective c, hope update swift apis take advantage of whole functions-as-objects philosophy):

you have object, called target, has method, called action, external caller call. (note i'm simplifying this, it's objective c runtime stuff) you have api phone call has target: (id)target, selector:(selector)selector somewhere in signature. should tell that api planning phone call method, have provide, on object, have provide. those be, respectively, target , action. since view holds method want nstimer run, view going target, , method action. when provide selfas target, telling nstimer phone call method named "dosomework" on view controller, not implement such method. no wonder triggers error unrecognized selector! furthermore, if did pass view target, have triggered error nonetheless, right selector associated method "dosomework:", in objective c method signatures.

here's closest right implementation:

class graphicviewcontroller: uiviewcontroller { var timervc!:nstimer override func viewdidload() { allow gview = view graphicview gview.timerv = nstimer.scheduledtimerwithtimeinterval(interval, target: gview, selector: selector("dosomework"), userinfo: nil, repeats: true) } } class graphicview: uiview { var timerv:nstimer! func dosomework() {/*code*/} }

as per arguments , returning: according target-action paradigm, expected not utilize homecoming value method you're calling. target-action provides mechanism target communicate sender object (the nstimer): if selector provide accepts no arguments (i. e. not end colon), method called without argument; if selector expect argument (i. e. ends colon), sender phone call passing argument. obviously, have update called method accordingly:

class graphicview: uiview { var timerv:nstimer! func dosomework(sender: nstimer!) { /* work involving sender */ } }

regarding final question, if understand correctly asking way avoid having refer method defined within graphicview within uiviewcontroller. possible, won't allow setup nstimer without using target-action (as of today). sure, more convenient way implement whole thing be:

class graphicviewcontroller: uiviewcontroller { override func viewdidload() { allow gview = view graphicview gview.setuptimer() } } class graphicview: uiview { var timer: nstimer! func dosomework(sender: nstimer!) { /* code */ } func setuptimer() { timer = nstimer.scheduledtimerwithtimeinterval(interval, target: self, selector: selector("dosomework:"), userinfo: nil, repeats: true) } }

and in implementation makes sense pass selfas target, because view setting timer phone call method on itself. way access timer within view controller creating temporary constant above , accessing timer property.

ios swift

No comments:

Post a Comment