viewWillAppear UIAlertView 不显示

Posted

技术标签:

【中文标题】viewWillAppear UIAlertView 不显示【英文标题】:viewWillAppear UIAlertView not showing 【发布时间】:2015-01-01 20:18:38 【问题描述】:

我有两个不同的视图控制器,一个用于仪表板,一个用于注册。在用户通过警报视图登录之前,我不希望用户能够与仪表板上的任何内容进行交互。因此,每次用户导航回仪表板或按下取消并且他们没有登录时,我都希望弹出登录警报。

这在所有情况下都能完美运行,包括当用户在注册视图中点击导航栏上的后退按钮时,但当用户在注册页面的警报上单击“确定”时不起作用。

仪表板视图包含以下代码:

@property(strong) UIAlertView * alert;
//...
-(void)viewWillAppear:(BOOL)animated

    user_email = [[NSUserDefaults standardUserDefaults] stringForKey:@"email"];
    if ( user_email==nil )
        [self auto_login];
     else //...


-(void)auto_login

     alert = [[UIAlertView alloc] initWithTitle:@"Login" message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Login",@"Forgot Password",@"Register",nil];
     alert.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput;
     [alert show];


-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

    switch (buttonIndex) 
        case 0:
        
            self.debug.text = @"Cancel";
            [self auto_login];
            break;
        
        //...
        default:
        
            self.debug.text = @"Register";
            [self nav_register];
            break;
        
    


-(void)nav_register

    RegisterProfileController *rvc = [[RegisterProfileController alloc] init];
    [self.navigationController pushViewController:rvc animated:YES];

注册视图控制器包含以下代码:

-(void)catch_registration

    NSString *response = [[NSString alloc] initWithData:self.httpdata encoding:NSASCIIStringEncoding];
    if( [response isEqualToString:@"OK"] )
        UIAlertView *successAlert = [[UIAlertView alloc] initWithTitle:@"Success" message:@"..." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        successAlert.alertViewStyle = UIAlertViewStyleDefault;
        [successAlert show];
    
    else //...


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

    if ([alertView.title isEqualToString:@"Success"])
        [self.navigationController popViewControllerAnimated:TRUE];

经过调试,我知道clickedButtonAtIndex在注册视图控制器中运行后,[alert show]在仪表板视图控制器中运行,clickedButtonAtIndex在仪表板视图控制器中没有运行,但没有出现任何警报。

为什么没有显示警报或者我该如何进一步调试?

【问题讨论】:

尝试将您的 viewWillAppear 代码移动到 viewDidAppear,因为现在您正尝试在有视图显示之前显示警报。 (实际上重新阅读您的问题,我不是 100% 确定我理解这个问题。) 不,这是问题所在。我不知道有 viewDidAppear 方法。现在可以使用了 好的,很酷。很高兴听到你想通了。 :) 【参考方案1】:

如果clickedButtonAtIndex 如您所说“没有运行”,那么delegate 可能设置不正确。此外,您可能应该将代码从viewWillAppear: 移动到viewDidAppear:,因为此时视图不在视图层次结构中。您的解决方案可能是这两个问题的结合。

【讨论】:

以上是关于viewWillAppear UIAlertView 不显示的主要内容,如果未能解决你的问题,请参考以下文章

Viewwillappear 已调用但 viewdidappear 未调用

阻止在 viewWillAppear 中打开窗口

后台模式下的 viewWillAppear 等效项

viewWillAppear 和 viewDidAppear 之间的操作?

什么时候放入viewWillAppear,什么时候放入viewDidLoad?

viewWillAppear 是如何工作的?