【问题标题】:Segue from one storyboard to a different storyboard?从一个故事板转到另一个故事板?
【发布时间】:2013-09-17 15:05:06
【问题描述】:

我在一个故事板上有太多视图,这导致它运行得很慢。有人告诉我,解决此问题的方法是将一个情节提要分成多个情节提要。谁能告诉我如何通过按钮从情节提要 1 上的视图转到情节提要 2 中的视图?

【问题讨论】:

    标签: ios xcode storyboard segue


    【解决方案1】:

    使用 Xcode 7,您可以选择 Storyboard References

    并设置目标故事板和控制器

    【讨论】:

    • 我不知道这个功能,这对我帮助很大!
    【解决方案2】:
    【解决方案3】:

    在 Swift (iOS 8.1) 中这很容易

      var storyboard: UIStoryboard = UIStoryboard(name: "Another", bundle: nil)
      var vc = storyboard.instantiateViewControllerWithIdentifier("NextViewController") as AnotherViewController
      self.showViewController(vc, sender: self)
    

    Swift 3 更新:

    let storyboard: UIStoryboard = UIStoryboard(name: "Another", bundle: nil)
    let vc = storyboard.instantiateViewController(withIdentifier: "NextViewController") as! AnotherViewController
    self.show(vc, sender: self)
    

    【讨论】:

      【解决方案4】:

      使用 segues (iOS SDK 6.0+) 的另一种解决方案,它使代码按用途分开并留有定制空间:

      - (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
          //check/validate/abort segue
          return YES;
      }//optional
      
      - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
          //sender - segue/destination related preparations/data transfer
      }
      
      #pragma mark - Table view delegate
      
      - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
          UIViewController *destination = [[UIStoryboard storyboardWithName:@"SomeStoryboard" bundle:nil] instantiateInitialViewController];
      
          UIStoryboardSegue *segue = [UIStoryboardSegue segueWithIdentifier:@"identifier" source:self destination:destination performHandler:^(void) {
              //view transition/animation
              [self.navigationController pushViewController:destination animated:YES];
          }];
      
          UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
          [self shouldPerformSegueWithIdentifier:segue.identifier sender:cell];//optional
          [self prepareForSegue:segue sender:cell];
      
          [segue perform];
      }
      

      注意: UITableViewCell *cell 用作sender 以保持默认 TableViewController 响应行为。

      【讨论】:

      • 很好的解决方案 Nocross,谢谢!我看到你的 sn-p 做了一个“推送”segue。我通过将块中的代码更改为 (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated 对其进行了“替换”
      【解决方案5】:

      我尝试了我读过的所有内容,但仍然没有成功。 我已经设法使用Rob Browns Storyboard Link 让它工作了 它易于实施且运行速度非常快

      【讨论】:

      • 我绝对会推荐它。我现在已经将它用于多个应用程序,它就是这么简单
      【解决方案6】:

      XCode 7 终于添加了这个功能,您可以使用界面生成器在两个不同故事板中的视图控制器之间进行切换。到目前为止,我们必须以编程方式执行此操作。

      【讨论】:

        【解决方案7】:

        首先,将故事板分成多个独立的部分是个好主意,可以省去很多麻烦(特别是如果您在一个团队中并在故事板文件中处理大量合并冲突时)。

        现在回答您的问题 - 您不能在两个故事板之间执行转场,但我取得了巨大成功的一个解决方案是执行以下操作:

        - (IBAction)buttonPressed:(id)sender {
        
            UIViewController *otherVC = [[UIStoryboard storyboardWithName:@"SecondStoryboard" bundle:nil] instantiateInitialViewController]; //Or get a VC by its identifier
        
            [self.navigationController pushViewController:otherVC animated:YES];
        }
        

        只需加载另一个故事板,然后调用instantiateInitialViewControllerinstantiateViewControllerWithIdentifier:,然后执行您想要的任何转换。

        希望这会有所帮助。

        【讨论】:

        • 所以您只需引用情节提要,它就会转到情节提要中的初始 ViewController?
        • 我创建了两个故事板,在第一个 VC 上放置了一个按钮并将其设为 buttonPressed。它没有链接到第二个,应用程序只是崩溃了。我对 Obj C 还是很陌生,所以我不确定我所做的是否正确。您发布的代码是我需要的唯一代码吗?
        • @BrownEye,这取决于。您在第一个故事板中使用导航控制器吗?该代码仅显示了如何从第二个故事板中获取 VC。您无法在两者之间进行切换,这是一个手动过程。你遇到了什么崩溃?
        • 我有一个通过普通 ViewController 中的容器嵌入的 tableview,每个指南都列在 tableview 中,并且每个步骤都有自己的一组视图。指南上每个页面/步骤的底部都有一个标签栏样式,基本上是 4 个主要页面中每个页面的按钮。我想拆分故事板,因此每个人可能有 4 个指南或一个故事板,用于我们的 4 个主要标签页中的每一个。目前访问每个指南的方法是通过 tableview,然后他们通过按钮继续返回。我希望能够转到不同故事板中的指南或菜单。因为它很慢
        • self.navigationController 在设置 IBAction 时将为 nil
        【解决方案8】:

        这是一个简单的 Swift 解决方案:

            let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as UIViewController
            // .instantiatViewControllerWithIdentifier() returns AnyObject! this must be downcast to utilize it
        
            self.presentViewController(viewController, animated: false, completion: nil)
        

        【讨论】:

          【解决方案9】:

          斯威夫特 3

          let vc = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerIdentifier") as? ExpectedViewControllerClass
          self.show(vc, sender: self)
          

          “StroboardName”是您的 .storyboard 文件的名称。 “ViewControllerIdentifier”是故事板中视图的 id。 而“self”是任何 UIViewController

          In my case, the identifier was "chooseCountryViewController"

          【讨论】:

            猜你喜欢
            • 2014-11-13
            • 2012-03-23
            • 1970-01-01
            • 2017-02-22
            • 1970-01-01
            • 2017-05-14
            • 2017-01-04
            • 1970-01-01
            • 2012-12-03
            相关资源
            最近更新 更多