【问题标题】:Can I change a segue identifier depending on another segue identifier, in code?我可以在代码中根据另一个 segue 标识符更改一个 segue 标识符吗?
【发布时间】:2014-08-24 00:01:01
【问题描述】:

我可以根据代码中的另一个 segue 标识符来更改一个 segue 标识符吗?我什至不确定这是否是我想要做的正确问题。

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

第一个 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 中显示的数据由前 2 个 viewController 的 segue ID 确定。

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

我认为层次结构可能是更简单的解释方式。

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

【问题讨论】:

  • 在您的层次结构中,假设您在第三行中有 viewController A 和 B。我看到他们都可以去 tableViewController,但你也想让它去另一个方向吗?例如,如果我从 A 加载 tableVC,您是否也想要一个选项返回到 B?
  • @AlexJ 不,不是因为 A 和 B 各自都有导航控制器。它们是第二行 ViewController 下的一种独立实体。我宁愿他们只是回到第二行viewController,然后选择从那里去B。
  • 在那种情况下,你不能直接调用 [self.navigationController popViewControllerAnimated:YES] 吗?或者,如果你需要在 segue 中做一些特定的事情,你可以在你的 3rd ViewController 中有一个变量来识别你以前的 ViewController,然后在 segue 中做一个 if 语句

标签: ios objective-c cocoa-touch uiviewcontroller


【解决方案1】:

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

例如:

如果你从控制器 A 到 B 再到 C,并且从 A 到 B 有 3 个可能的 segues 从 B 到 C 有 3 个可能的 segues,你可以在 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"
   }
}

在乙:

-(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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-20
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      相关资源
      最近更新 更多