我可以在代码中根据另一个segue标识符更改segue标识符吗?

时间:2014-07-03 02:15:41

标签: ios objective-c cocoa-touch uiviewcontroller

我可以根据代码中的其他segue标识符更改segue标识符吗?我甚至不确定这是否是我正在寻找的正确问题。

我有一个ViewController,上面有许多按钮。
每个按钮都有一个到另一个ViewController的segue,其中包含一些标签,图像和按钮。
这些标签,图像和按钮的文本/图像/标题由按下哪个segue(前一个ViewController上的哪个按钮)确定。这是通过在初始ViewController中为每个属性赋予变量并在第二个ViewController中分配该变量来完成的 例如。 (我不会单独把.h和.m放在一个标题之下!)

1st ViewController:

-(void) prepareForSegue: (UIStoryboardSegue*)segue sender:(id)sender{
    if ([segue.identifier isEqualToString:@"someSegIdentifier"]){
        2ndViewController *aVC = (2ndViewController *)(segue.destinationViewController);
        aVC.TitleString = @"A Title";
        aVC.FImg = [UIImage imageNamed:@"someimage.jpg";
        aVC.Button1String = @"Button 1 Text";
        aVC.Button2String = @"Button 2 Text";
        etc...
} }

第二视图控制器:

@property (strong, nonatomic) UIImage *FImg;
@property (strong, nonatomic) NSString *TitleString;
@property (strong, nonatomic) NSString *Button1String;
@property (strong, nonatomic) NSString *Button2String;
@property (strong, nonatomic) IBOutlet UILabel *TitleLabel;
@property (strong, nonatomic) IBOutlet UIImageView *FImageView;
@property (strong, nonatomic) IBOutlet UIButton *Button1;
@property (strong, nonatomic) IBOutlet UIButton *Button2;


-(void)viewDidLoad
{
    self.TitleLabel.text = self.TitleString;
    self.FImageView.image = self.FImg;
    [self.Button1 setTitle:self.Button1String forState:UIControlStateNormal];
    [self.Button2 setTitle:self.Button2String forState:UIControlStateNormal];
}

从这个ViewController中,每个按钮都链接到另一个ViewController(其中包含NavControllers),这两个ViewControllers也有2个按钮,分别链接到tableViewController。 tableView中显示的数据由前两个viewControllers中的segue ID确定。

我相信我需要在第二组viewControllers上重复第一个进程(上面的代码),但同时更改进程/目标viewController的segue ID,以便tableView可以加载正确的数据。如何更改此标识符?

我认为层次结构可能更容易解释它。 Hierarchy

我将如何根据之前的ViewController显示的内容更改特定的segue标识符。请记住,对于每个级别,他们都有许多不同的链接'或指定的属性。

2 个答案:

答案 0 :(得分:0)

您可以,而不是通过segue标识符从以前的控制器发送信息,在目标视图控制器上创建属性,并根据按下的按钮(或segue标识符)在segue TO视图控制器时更改这些属性。然后,当视图控制器中存在segue时,您将这些属性和segue标识符用作参数,而不仅仅是segue标识符。

e.g:

如果你从控制器A到B到C,并且从A到B有3个可能的段,从B到C有3个可能的段,你可以在B中有一个NSString属性喜欢

in A:
-(void) prepareForSegue: (UIStoryboardSegue*)segue sender:(id)sender{
   if ([segue.identifier isEqualToString:@"identifier1"]){
        2ndViewController *aVC = (2ndViewController *)(segue.destinationViewController);
        aVC.propertyIWasTalkingAbout = "segue1"
   }
   else if ([segue.identifier isEqualToString:@"identifier2"]){
        2ndViewController *aVC = (2ndViewController *)(segue.destinationViewController);
        aVC.propertyIWasTalkingAbout = "segue2"
   }
   else if ([segue.identifier isEqualToString:@"identifier3"]){
        2ndViewController *aVC = (2ndViewController *)(segue.destinationViewController);
        aVC.propertyIWasTalkingAbout = "segue3"
   }
}

在B:

-(void) prepareForSegue: (UIStoryboardSegue*)segue sender:(id)sender{
   if ([segue.identifier isEqualToString:@"identifier4"]){
        switch (self.propertyIWasTalkingAbout){
             case("segue1"):
             //...
             break;
             case("segue2"):
             //...
             break;
             case("segue3"):
             //...
             break;
        }

   }
   else if ([segue.identifier isEqualToString:@"identifier5"]){
switch (self.propertyIWasTalkingAbout){
             case("segue1"):
             //...
             break;
             case("segue2"):
             //...
             break;
             case("segue3"):
             //...
             break;
        }
   }
   else if ([segue.identifier isEqualToString:@"identifier6"]){
        switch (self.propertyIWasTalkingAbout){
             case("segue1"):
             //...
             break;
             case("segue2"):
             //...
             break;
             case("segue3"):
             //...
             break;
        }
   }
}

我在这里编写了所有这些代码,而不是在XCode上,所以可能会有一些错误,但我希望你能得到这个想法,我也希望得到你的意思:p

答案 1 :(得分:0)

是的,你肯定是在问错误的问题。你是为每个按钮创建一个segue? 这是错误的方法,因为segue意味着在两个视图控制器之间。 如果你有100个按钮,你会创建100个segues吗? 在你的情况下,你有2个控制器,所以它应该只有一个segue。

如果您需要知道按下了哪个按钮,我建议您给发件人一个标签号,并在准备进行预测时进行检查。