views:

192

answers:

3

I have BaseView which implement UIViewController. Every view in project must implement this BaseView.

In BaseView, I have method:

-(void) checkLoginStatus
{
    defaults = [[NSUserDefaults alloc] init];

    if(![[defaults objectForKey:@"USERID"] length] > 0 )
    {
        Login *login=[[Login alloc] initWithNibName:@"Login" bundle:nil];
        [self.navigationController pushViewController:login animated:TRUE];
        [login release];
    }
    [defaults release];
}

The problem is my Login view also implement BaseView, checks for login, and again open LoginView i.e. stuck in to recursive calling.

Can I check in checkLoginStatus method if request is from LoginView then take no action else check login. Ex:

- (void) checkLoginStatus
{
    **if(SubView is NOT Login){** 
        defaults = [[NSUserDefaults alloc] init];

        if(![[defaults objectForKey:@"USERID"] length] > 0 )
        {
            Login *login=[[Login alloc] initWithNibName:@"Login" bundle:nil];
            [self.navigationController pushViewController:login animated:TRUE];
            [login release];
        }
        [defaults release];
    }
}

Please help..

A: 

Add one parameter in checkLoginStatus and set that parameter when you you call method from LoginView and in checkLoginStatus check that parameter if that parameter is set skip this block...i.e

if(![[defaults objectForKey:@"USERID"] length] > 0  && var1 != TRUE)
{
     Login *login=[[Login alloc] initWithNibName:@"Login" bundle:nil];
    [self.navigationController pushViewController:login animated:TRUE];
    [login release];

}
mihirpmehta
Thanks a lot, this would be a good workaround
iPhoneDev
+2  A: 

Use the following method:

if ([self isMemberOfClass:[Login class]])
{
    CFShow(@"Yep, it's the login controller");
}

isMemberOfClass tells you if the instance is an exact instance of that class. There's also isKindOfClass:

if ([self isKindOfClass:[BaseView class]])
{
    CFShow(@"This will log for all classes that extend BaseView");
}

isKind tests that the class is a extension of a certain class.

So given your example:

-(void) checkLoginStatus
{
    defaults = [[NSUserDefaults alloc] init];

    if (![self isMemberOfClass:[Login class]])
    {
        if (![[defaults objectForKey:@"USERID"] length] > 0 )
        {
            Login *login=[[Login alloc] initWithNibName:@"Login" bundle:nil];
            [self.navigationController pushViewController:login animated:TRUE];
            [login release];
        }
    }
    [defaults release];
}
Typeoneerror
Great answer thanks :)
iPhoneDev
+2  A: 

implement an empty checkLoginStatus in Login.

@implementation Login
  -(void) checkLoginStatus {}
@end
drawnonward