如何等到模态对话框在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())实现等待效果,并同时进行其他操作?(先显示等待,再进行其他操作!)