因此用户需要从UIAlertView向UITextField输入内容。然后点击oke按钮,他将使用信息进入下一个视图。
但我好像被卡住了?
我有这个:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex == 1) {
UIStoryboardSegue *segue = [[UIStoryboardSegue alloc] init];
AddViewController *add = [segue destinationViewController];
UITextField *textfield = [alertView textFieldAtIndex: 0];
[add set_aantalDice:textfield.text.intValue];
[self performSegueWithIdentifier:@"addSegue" sender:self];
}else{
NSLog(@"Cancel");
}
}
但这不起作用。如何通过segue和UIAlertView获取信息?我现在已经尝试了3个小时..
亲切的问候
答案 0 :(得分:1)
虽然Jonathan给你一个关于你做错的所有其他事情的大量解释,但问题要小得多。您的UIAlertView
被解雇,当segue发生时,数据不再存在。您自己创建的AddViewController
只是一个局部变量,根本不在segue中使用,因此您设置的属性将被丢弃。
如果您想使用segue,则需要以Apple的方式进行。这意味着通过覆盖prepareForSegue
方法提供数据。
所以你需要做的是:
在当前视图控制器中创建一个属性,该属性将字符串存储在UITextField
UIAlertView
上。
@property (nonatomic) NSInteger aantalDice;
使用以下代码将文本存储在alertView:clickedButtonAtIndex:
中(应删除所有其他代码):
UITextField *textfield = [alertView textFieldAtIndex:0];
[self setAantalDice:textfield.text.intValue];
[self performSegueWithIdentifier:@"addSegue" sender:self];
实施prepareForSegue:
方法。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue identifier] isEqualToString:@"addSegue"])
{
AddViewController * addViewController = [segue destinationViewController];
[addViewController set_aantalDice:self.aantalDice];
}
}
数据现在应该在AddViewController
。
这是因为performSegueWithIdentifier
方法处理UIViewController
创建本身,因此您不必自己实例化新的视图控制器。
答案 1 :(得分:0)
如果要在代码中手动创建segue,则应使用以下UIStoryboardSegue工厂方法。
segueWithIdentifier:source:destination:performHandler:
我发现使用Interface Builder更容易管理通用segue。所有你需要做的就是通过按下控制+在ViewController A上拖动到ViewController B,从ViewController A到ViewController B创建一个手动segue。然后,选择类型(例如Push,Modal)并给segue一个标识符。
接下来,从UIAlertView Delegate方法中删除以下代码:
UIStoryboardSegue *segue = [[UIStoryboardSegue alloc] init];
AddViewController *add = [segue destinationViewController];
UITextField *textfield = [alertView textFieldAtIndex: 0];
[add set_aantalDice:textfield.text.intValue];
然后,在ViewController A中实现方法prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
。
在上述方法的定义中,放置以下代码:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue identifier] isEqualToString:@"addSegue"])
{
AddViewController * addViewController = [segue destinationViewController];
UITextField * textfield = [alertView textFieldAtIndex: 0];
[addViewController set_aantalDice:textfield.text.intValue];
}
}
可选强>
不是检查buttonIndex == 1,而是还可以检查按钮的标题是否为== @"好的"。
E.g。
if ([[alertView buttonTitleAtIndex:buttonIndex] isEqualToString:@"Okay"])
{
// Do something...
}
<强>解释强>
在您现在拥有的代码中,您正在分配UIStoryBoardSegue的实例,而没有执行segue所需的适当信息(例如,标识符,源视图控制器和目标视图控制器)。当您尝试使用[segue destinationViewController]访问目标ViewController时,该值将返回nil,因为segue的实例没有目标。当您尝试使用标识符@&#34执行segue时; addSegue&#34;什么都不会发生,因为你实例化的segue没有标识符。
我建议在这里阅读segues:https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomSegues/CreatingCustomSegues.html
希望这有帮助。