ios - Setting up a delegate to determine a login sequence has completed -
i trying follow question setup delegate login sequence:- how set simple delegate communicate between 2 view controllers?
in application have main view (meshomeviewcontroller). have login structure follows:
- mesloginnavcontroller
- with root view controller of meswelcomeviewcontroller
- there mesloginviewcontroller , messignupviewcontrollers can pushed stack.
my aim have delegate method called when user logs in. using delegate cannot use viewdidload view reloaded/shown on different occasions need see when user has completed login.
the user can login via welcome controller (via facebook) or login controller (via normal methods) , via signup (via signup ;).
this have tried implement below: meshomeviewcontroller.h
#import "meswelcomeviewcontroller.h" @interface meshomeviewcontroller : uiviewcontroller <loginviewcontrollerdelegate> @end in meshomeviewcontroller.m check if user logged in, if not complete following:
nslog(@"not logged in"); meswelcomeviewcontroller *loginnavvc = [self.storyboard instantiateviewcontrollerwithidentifier:@"welcomevc"]; loginnavvc.delegate = self; [self presentmodalviewcontroller:loginnavvc animated:no]; in meswelcomeviewcontroller.h have following:
@protocol loginviewcontrollerdelegate; @interface meswelcomeviewcontroller : uiviewcontroller <nsurlconnectiondatadelegate> @property (nonatomic, weak) id<loginviewcontrollerdelegate> delegate; @end @protocol loginviewcontrollerdelegate <nsobject> - (void)didloginuser; @end once user logged in via custom method. meswelcomeviewcontroller.m once user logged in
nslog(@"%@",self.delegate); if ([self.delegate respondstoselector:@selector(didloginuser)]) { [self.delegate didloginuser]; } however, delegate method not being called, appears self.delegate null welcomeviewcontroller. thinking possibly should set delegate login nav controller based on above setup, not sure how call delegate method view controller pushed on nav?
so confirm, have meshomeviewcontroller, primary view. here, push meswelcomeviewcontroller onto stack. meswelcomeviewcontroller can perform login stuff, , once complete, calls [self.delegate didloginuser].
if case, when initialize meswelcomeviewcontroller, need set delegate. can in several ways. have init function meswelcomeviewcontroller takes in id
-(id) init:(id<loginviewcontrollerdelegate>)mydelegate { self = [super init]; if (self){ self.delegate = mydelegate; etc... } } alternatively, after creating meswelcomeviewcontroller, before pushing it, set delegate property
meswelcomeviewcontroller *welcomeview = [[meswelcomeviewcontroller alloc] init]; [welcomeview setdelegate:self]; // push view stuff edit:
the init function gave there isn't automatically called, have explicitly called instead of default initializer. if you're using storyboards, should using alternative of setting delegate property. i've never used storyboards before, should able this:
meswelcomeviewcontroller *welcomeview = [self.storyboard instantiateviewcontrollerwithidentifier:@"welcomevc"]; [welcomeview setdelegate:self]; [self presentmodalviewcontroller:welcomeview animated:no]; edit 2: best alternative use notifications instead. wants listen adds observer nsnotificationcenter, , when event occurs, post notification.
example:
in meshomeviewcontroller's initialize or viewdidload, put following:
[[nsnotificationcenter defaultcenter] addobserver:self selector:@selector(didloginuser) name:@"logincompletenotification" object:nil]; then whenever complete login, following:
[[nsnotificationcenter defaultcenter] postnotificationname:@"logincompletenotification" object:nil]; finally, make sure stop listening in dealloc of listening
[[nsnotificationcenter defaultcenter] removeobserver:self name:@"logincompletenotification object:nil]
Comments
Post a Comment