Objective C - 当从按钮调用 VC 时,ViewController 的功能不起作用

Posted

技术标签:

【中文标题】Objective C - 当从按钮调用 VC 时,ViewController 的功能不起作用【英文标题】:Objective C - ViewController's functions aren't working when VC is called from button 【发布时间】:2015-07-22 08:20:28 【问题描述】:

我的警报视图上的一个按钮有问题。

- (void)viewDidLoad 

    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    if (! [defaults boolForKey:@"notFirstRun"]) 

        UIAlertView *welcomeAlert = [[UIAlertView alloc] initWithTitle:@"Welcome!" message:@"This is your first run of Energy Calculator, please select Your default settings first!" delegate:self cancelButtonTitle: @"No, thanks" otherButtonTitles:@"Go to settings", nil];
        [welcomeAlert show];

        [defaults setBool:YES forKey:@"notFirstRun"];
    



    [super viewDidLoad];
    
- (void)alertView:(UIAlertView *)welcomeAlert clickedButtonAtIndex:(NSInteger)buttonIndex

        if (buttonIndex == [welcomeAlert cancelButtonIndex]) 

            [welcomeAlert dismissWithClickedButtonIndex:0 animated:NO];
            NSLog(@"przycisk 1");

         else if (buttonIndex == 1) 

            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
            SettingsVC *viewController = [storyboard instantiateViewControllerWithIdentifier:@"SVC"];
            [self presentViewController:viewController animated:NO completion:nil];


             
        

当我在我的第一个 ViewController 上使用“普通”切换按钮时,第二个 Viewcontroler 上的每个功能都可以完美运行(即,将两个值相乘,甚至使用简单的“关闭视图控制器”方法的“返回”按钮)。 标记一下,这个“正常”的开关​​按钮有方法“以模态方式显示第二个视图控制器”

但是当我使用 UIAlertView 上的“转到设置”按钮时,上述功能均不起作用。我认为问题的一部分是第二个视图控制器是非模态呈现的,这与“正常”切换按钮的帮助不同。 有什么解决方案的想法吗?

【问题讨论】:

我建议您使用 UIAlertController,因为 UIAlertView 在 ios 8.0 中已被弃用 您能否澄清一下您如何设置视图控制器以及您要达到的目标是什么?不是很清楚。 我想通过单击警报视图中的按钮来呈现我的第二个视图(!),因为当我通过“PresentViewController”呈现它时,第二个视图上的任何方法都不起作用。 所以当你展示你的视图控制器时,它实际上是在显示但它不起作用? 是的,根本不起作用。我无法使用“后退”按钮,我的任何操作都不起作用。 顺便说一句,我知道 UIAlerView 将被弃用,但我完成后不需要开发此应用程序。 【参考方案1】:

在查看了您的答案后,我决定尝试使用通常用于在控制器之间发送数据的 segue。我不知道我可以再次使用 segue。

有我的更改 - 注释行是我尝试过的所有内容。

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

    if (buttonIndex == [welcomeAlert cancelButtonIndex]) 

        [welcomeAlert dismissWithClickedButtonIndex:0 animated:NO];
        NSLog(@"przycisk 1");

     else if (buttonIndex == 1) 

       // UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        //SettingsVC *viewController = [storyboard instantiateViewControllerWithIdentifier:@"SVC"];
        //[self presentViewController:viewController animated:NO completion:nil];

        //[self showDetailViewController:viewController sender:nil];
        [self performSegueWithIdentifier:@"settingSegue" sender:nil];


         
    

【讨论】:

【参考方案2】:

您可以尝试将 UIAlertView 代码从 viewDidLoad 方法移动到 viewDidAppear 方法吗?在 viewDidLoad 中,当前视图尚未处于层次结构中,当您显示 alert-view 时,它可能会在 view-hierarchy 中产生混淆

所以

- (void)viewDidAppear:(BOOL)animated 
    [super viewDidAppear:animated];

    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    if (! [defaults boolForKey:@"notFirstRun"]) 

        UIAlertView *welcomeAlert = [[UIAlertView alloc] initWithTitle:@"Welcome!" message:@"This is your first run of Energy Calculator, please select Your default settings first!" delegate:self cancelButtonTitle: @"No, thanks" otherButtonTitles:@"Go to settings", nil];
        [welcomeAlert show];

        [defaults setBool:YES forKey:@"notFirstRun"];
    
    

另外,尽量避免 UIAlertView ,因为它在 iOS8+ 中已被弃用,使用一些兼容的视图仍然支持 iOS 7,例如 https://github.com/ogres/CUIAlertController

您可以轻松完成整个过程,无需委托回调:

- (void)viewDidAppear:(BOOL)animated 
    [super viewDidAppear:animated];

    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    if (! [defaults boolForKey:@"notFirstRun"]) 

            NSMutableArray *actions = [[NSMutableArray alloc] init];

            [actions addObject:[CUIAlertAction actionWithTitle:@"Go to settings" block:^
                UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
                SettingsVC *viewController = [storyboard instantiateViewControllerWithIdentifier:@"SVC"];
                [self presentViewController:viewController animated:NO completion:nil]
            ]];        

            [actions addObject:[CUIAlertAction actionWithTitle:@"No, thanks" block:nil]];


            [CUIAlertController presentAlertViewWithTitle:@"Welcome!"
                                                  message:@"This is your first run of Energy Calculator, please select Your default settings first!" 
                                                  actions:actions
                                           fromController:self
                                                 animated:YES];

            [defaults setBool:YES forKey:@"notFirstRun"];
    
    

【讨论】:

以上是关于Objective C - 当从按钮调用 VC 时,ViewController 的功能不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Objective C如何在从第一个VC移动到第二个时停止无限循环

Objective-C - 从不同的类访问属性[重复]

IOS / Objective-C / Storyboard:推送视图控制器的后退按钮未激活

仅当从警报调用时,如何向第二个向下钻取View Controller添加按钮?

IOS/Objective-C:调用另一个类(VC)方法不起作用

使用 webView Objective C 加载到另一个 VC 的可点击条款和政策