2014-03-30 49 views
0

所以用户需要从UIAlertView输入一些内容到UITextField中。然后通过点击oke按钮,他会看到有关信息的下一个视图。UIAlertview和Segue推送信息

但我似乎卡住了?

我有这样的:

- (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小时..

亲切的问候

回答

1

虽然乔纳森给了你所做的其他所有事情的大解释,但问题却小得多。您的UIAlertView已被解雇,并且发生继续时,数据不再存在。你自己创建的AddViewController只是一个局部变量,根本不在segue中使用,所以你设置的属性将被丢弃。

如果你想使用一个segue,你需要这样做苹果的方式。这意味着通过重写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]; 
        } 
    } 
    

数据现在应该在AddViewController

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

+0

谢谢!所以基本上我误解了它。并且执行SegueWithIdentifier,在使用[self performSegueWithIdentifier时总是被调用:@“addSegue”sender:self]; – Kets

+1

是的,在调用'performSegueWithIdentifier'时总是调用'prepareForSegue',所以不用担心。 – Legoless

0

如果你想手动创建代码,您应该使用以下UIStoryboardSegue工厂方法SEGUE。

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来管理。所有你需要做的就是创建一个从ViewController A到ViewController B的手动循环,方法是按下ControlControl并拖动ViewController A到ViewController B.然后,选择类型(例如Push,Modal)并给Segue一个标识符。

接下来,从UIAlertView中委托方法除去下面的代码:

UIStoryboardSegue *segue = [[UIStoryboardSegue alloc] init]; 

AddViewController *add = [segue destinationViewController]; 

UITextField *textfield = [alertView textFieldAtIndex: 0]; 

[add set_aantalDice:textfield.text.intValue]; 

然后,在视图控制器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 destinationViewController]访问目标ViewController时,该值将返回nil,因为segue的实例没有目标。当您尝试执行带有标识符@“addSegue”的segue时,将不会发生任何事情,因为您实例化的segue没有标识符。

这里我推荐阅读塞格斯: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

希望这有助于。