如何推迟一种方法?

时间:2009-07-14 20:39:46

标签: iphone objective-c xcode

我正在开发iPhone应用程序。当应用程序启动时,我进行身份验证,建立Restful连接,以XML文件的形式获取数据,解析它,然后以表格视图的形式显示它。 这是我的问题。 如果用户信息已存储在应用程序中,或者如果在代码中硬编码,则应用程序将获取身份验证用户名和密码,并继续以表格格式显示数据。我到现在为止用硬编码数据进行测试。现在我想显示另一个视图,如果用户名和密码不在应用程序中,则会询问用户名和密码。我想使用户名和密码动态而不是静态。 在我的情况下,当使用忙于输入用户名和密码时,“viewDidLoad”方法尝试与服务器建立连接,其中空白用户名和密码未通过服务器连接和表加载。但是如果我第二次运行应用程序,应用程序会找到之前输入的用户名和密码,并加载表格。

如果应用程序找不到用户名和密码,有没有办法可以延迟服务器连接的进程?用户输入用户名和密码后,如何通知服务器连接方法?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

你可以发布一些代码吗?如果没有看到正在发生的事情就很难推测,但无论如何我都会试一试。

您需要将连接到服务器的代码移出viewDidLoad,并将其放在回调方法或其他内容中。我建议使用名称和密码字段抛出警报,使视图控制器成为警报的委托,然后将clickedButtonAtIndex函数连接到服务器。

示例:

-(void)viewDidLoad {
    UIAlertView *loginAlert = [[UIAlertView alloc] initWithTitle:@"Login" message:@"Please enter your username and password below" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Login",nil];

    //You might have to do some fiddling with the frame sizes to make it fit in the alert.
    UITextField *userNameField = [[UITextField alloc] initWithFrame:CGRectMake(originX, originY, lengthX, lengthY)];
    userNameField.placeholder = @"User Name";
    [loginAlert addSubview:userNameField];
    //loginAlert will retain this so we release it now.
    [userNameField release];



    [UITextField *passwordNameField = [[UITextField alloc] initWithFrame:CGRectMake(originX, originY, lengthX, lengthY)];
    passwordNameField.secureTextEntry = YES;
    [loginAlert addSubview:passwordNameField];
    [passwordNameField release]

    //This line tells the iPhone to stretch out your AlertView so it's big enough for your two textViews, we use 0 and 130 respectively but we only have one text field.
    CGAffineTransform myTransform = CGAffineTransformMakeTranslation(stretchX, stretchY);

    [loginAlert setTransform:myTransform];
    [loginAlert show];
    [loginAlert release];
}


//Implement this method, it will be called when the user clicks the "login" button on your alert.
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    //Usually if they click cancel you do nothing, thats buttonIndex 0
        if(buttonIndex == 1) {
        //Connect to the server with the correct login and password.
    }
}

答案 1 :(得分:0)

一旦在窗口中显示视图,ViewDidLoad将始终被调用,这就是为什么它被称为viewDidLoad ...你需要做的是为登录步骤创建一个不同的视图,然后当用户完成登录时将单击一个登录按钮,该按钮将推送连接到您的restful服务的视图。如果用户数据已存在,则一起跳过登录页面并直接进入表格视图