UIAlertview和Segue推动信息

时间:2014-03-30 15:02:35

标签: ios objective-c

因此用户需要从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个小时..

亲切的问候

2 个答案:

答案 0 :(得分:1)

虽然Jonathan给你一个关于你做错的所有其他事情的大量解释,但问题要小得多。您的UIAlertView被解雇,当segue发生时,数据不再存在。您自己创建的AddViewController只是一个局部变量,根本不在segue中使用,因此您设置的属性将被丢弃。

如果您想使用segue,则需要以Apple的方式进行。这意味着通过覆盖prepareForSegue方法提供数据。

所以你需要做的是:

  1. 在当前视图控制器中创建一个属性,该属性将字符串存储在UITextField UIAlertView上。

    @property (nonatomic) NSInteger aantalDice;
    
  2. 使用以下代码将文本存储在alertView:clickedButtonAtIndex:中(应删除所有其他代码):

    UITextField *textfield = [alertView textFieldAtIndex:0];
    
    [self setAantalDice:textfield.text.intValue];
    
    [self performSegueWithIdentifier:@"addSegue" sender:self];
    
  3. 实施prepareForSegue:方法。

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue identifier] isEqualToString:@"addSegue"])
        {
            AddViewController * addViewController = [segue destinationViewController];
    
            [addViewController set_aantalDice:self.aantalDice];
        }
    }
    
  4. 数据现在应该在AddViewController

    这是因为performSegueWithIdentifier方法处理UIViewController创建本身,因此您不必自己实例化新的视图控制器。

答案 1 :(得分:0)

如果要在代码中手动创建segue,则应使用以下UIStoryboardSegue工厂方法。

segueWithIdentifier:source:destination:performHandler:

方法参考:https://developer.apple.com/library/ios/documentation/uikit/reference/UIStoryboardSegue_Class/Reference/Reference.html#//apple_ref/occ/clm/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

在这里:https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ManagingDataFlowBetweenViewControllers/ManagingDataFlowBetweenViewControllers.html#//apple_ref/doc/uid/TP40007457-CH8-SW4

希望这有帮助。