如何等到模态对话框在ios中返回结果

Posted

技术标签:

【中文标题】如何等到模态对话框在ios中返回结果【英文标题】:how to wait till a modal dialog returns a result in ios 【发布时间】:2012-05-06 13:33:18 【问题描述】:

我有一个自定义UIViewController 在http 基本身份验证委托中显示presentModalViewController 函数以获取用户名和密码。我想等到用户单击屏幕上显示的模式视图控制器上的登录按钮。我怎样才能做到这一点?我是 ios 新手,任何 cmets 或链接都将不胜感激。

编辑:这是NSURLConnectionDelegate中的示例代码

-(void) connection(NSURLConnection*)connection willSendRequestForAuthenticationChallenge(NSURLAuthenticationChallenge*)challenge

    CustomAuthViewController *authView = [CustomAuthViewController alloc] initWithNibName"@"CustomAuthViewController" bundle:[NSBundle mainBundle]];
    [parentcontroller presentModalViewController:authView animated:YES];
    // 
    // I want to wait here somehow till the user enters the username/password
    //
    [[challenge sender] userCredentials:credentials forAuthenticationChallenge:challenge];

亲切的问候。

编辑:解决方案:无需立即在 willSendRequestForAuthenticationChallenge 委托函数中发送凭据。我以后可以随时发送,但很奇怪。

【问题讨论】:

一旦用户单击按钮,您就可以关闭 modalViewController,这是您想要的吗? 很遗憾没有!!!我正在展示一个自定义 UIViewController 以在 willSendRequestForAuthenticationChallenge 函数中收集用户/密码。现在我必须等到用户输入用户/密码并单击登录按钮查看...否则我将无法在 presentModalViewController 之后的下一行中发送 userCredentials:forAuthenticationChallenge :( 【参考方案1】:

基本上,您想要的是在登录对话框完成时将消息从模态 UIViewController 传递给调用者。有很多方法可以做到这一点。这是一对:

选项 1 - 委托模式:

在您的模态对话框中 .h

@protocol LoginDelegate
- (void)loginComplete:(NSString *)userId;
- (void)loginFailed;
@end

@interface MyLoginDialog : UIViewController 
    UIViewController *delegate;


@property (nonatomic, retain) UIViewController *delegate;

在您的模态对话框中 .m

在你的初始化中:

delegate = nil;

在你的交易中:

[delegate release];

当您完成登录时:

[delegate dismissModalViewControllerAnimated:YES]; 
[delegate loginComplete:userId] or [delegate loginFailed];

然后在调用视图控制器上实现 LoginDelegate 协议。

当您创建登录视图控制器时,设置委托:

UIViewController *viewLogin = [[UIViewController alloc] init];
viewLogin.delegate = self;

选项 2 - 使用 NSNotificationCenter 发布通知:

在您的登录对话框中:

[self dismissModalViewControllerAnimated:YES];
[[NSNotificationCenter defaultCenter] postNotificationName:@"LoginComplete" object:nil];

在您的调用视图控制器上

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginComplete:) name:@"LoginComplete" object:nil];

然后你实现选择器 loginComplete。

如果您想传回登录信息(用户名、用户 ID 等),您可以将其打包到字典中,并将其作为“对象”添加到 postNotificationName 方法中。

你也需要一定要打电话

[[NSNotificationCenter defaultCenter] removeObserver:self];  

听完之后。

【讨论】:

没问题。如果答案对您有帮助/对您有用,请点赞/接受。 嗨乔尔,感谢您的努力,我真的很感激。 willSendRequestForAuthenticationChallenge 函数正在询问 userCredentials,所以在我显示带有 presentModalViewController 函数的对话框后,我将如何等待?如果没有,发送凭据的下一行将被执行。 您永远不会在代码块内“等待”异步操作。当登录对话框完成时,您在回调方法中实现 willSendRequestForAuthenticationChallenge。 可能是我遗漏了什么!!! NSURLConnection 调用 willSendRequestForAuthenticationChallenge,当发生这种情况时,我应该显示对话框。之前显示对话框没有意义。在我展示它之后,代码执行继续。可能是我完全糊涂了,如果你可以请给我一个代码sn-p...我也在原来的问题上放了一些代码。 您可能想要实现 didReceiveAuthenticationChallenge 而不是 willSendRequestForAuthenticationChallenge。 didReceiveAuthenticationChallenge 将暂停执行,直到您传回凭据。

以上是关于如何等到模态对话框在ios中返回结果的主要内容,如果未能解决你的问题,请参考以下文章

Qt如何使用模态(exec())实现等待效果,并同时进行其他操作?(先显示等待,再进行其他操作!)

如何在另一个线程中关闭 MFC 模态对话框并获得对话框返回值?

JavaFX如何实现模态窗口

如何制作 setVisible 阻塞的非模态对话框?

模态窗口和控件显示前后

如何创建一个模态的对话框