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移动到第二个时停止无限循环
IOS / Objective-C / Storyboard:推送视图控制器的后退按钮未激活
仅当从警报调用时,如何向第二个向下钻取View Controller添加按钮?