ios - How to remove observer defined without object and using block? -
within extension uiviewcontroller
have method:
func setupuserandcartbuttons() { let cartbarbuttonitem = uibarbuttonitem(image: dbcart.sharedcart().icon, style: .plain, target: self, action: selector("cartbuttontapped:")) nsnotificationcenter.defaultcenter().addobserverforname(dborderschangednotficationname, object: nil, queue: nil, usingblock: { [weak self] notification in print("---->\(self!.classforcoder)") cartbarbuttonitem.image = dbcart.sharedcart().icon }) }
i use change image uibarbuttonitem
.
this how push notification:
nsnotificationcenter.defaultcenter().postnotificationname(dborderschangednotficationname, object: nil)
for every controller, within deinit, need remove observer:
nsnotificationcenter.defaultcenter().removeobserver(self, name: dborderschangednotficationname, object: nil)
but doesn't work:
when push notification , deinit
never called (what means never pop controller stack) looks ok, no crash, once pop @ least 1 view controller (deinit called then) , push notification, there crash:
fatal error: unexpectedly found nil while unwrapping optional value
you using addobserverforname:object:queue:usingblock:
setup observer. in order later remove observer need use return value of method "observer" in calls removeobserver:...
variants.
since setting observer in extension method of uiviewcontroller
, , assuming calling concrete uiviewcontroller
subclasses, i'd suggest updating method return observer
func setupuserandcartbuttons() -> nsobjectprotocol { let cartbarbuttonitem = uibarbuttonitem(image: dbcart.sharedcart().icon, style: .plain, target: self, action: selector("cartbuttontapped:")) let observer = nsnotificationcenter.defaultcenter().addobserverforname(dborderschangednotficationname, object: nil, queue: nil, usingblock: { [weak self] notification in print("---->\(self!.classforcoder)") cartbarbuttonitem.image = dbcart.sharedcart().icon }) return observer }
you have setup property in view controllers make use of method in order keep reference observer:
class dbsomeviewcontroller: uiviewcontroller { var orderschangedobserver: nsobjectprotocol? ... }
then assign return value of setupuserandcartbuttons
property:
orderschangedobserver = setupuserandcartbuttons()
and remove observer in deinit
:
deinit { nsnotificationcenter.defaultcenter().removeobserver(orderschangedobserver) }
credit
i can't take full credit answer dániel nagy pretty got in comment on question.
Comments
Post a Comment