从一个故事板转到另一个故事板?

32

我在一个Storyboard上有太多的视图,导致其运行非常缓慢。我被告知解决此问题的方法是将一个Storyboard拆分为多个Storyboard。请问如何通过按钮从Storyboard 1上的一个视图切换到Storyboard 2上的一个视图?

9个回答

35

Xcode 7 版本及以上支持使用Storyboard引用。

你可以通过以下步骤设置目标故事板和控制器:

1. 在Interface Builder中选择需要添加引用的场景

图片描述

2. 在Xcode菜单栏中选择Editor -> Refactor to Storyboard Reference

图片描述


我不知道这个功能,这对我帮助很大! - inexcitus

27

在 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)


9

另一种解决方案是使用 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,谢谢!我看到你的片段执行了“Push”转场。我通过更改块中的代码来使其适应“Replace”。(void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated - jbbenni

6

我尝试了一切我读到的但仍然没有成功。 使用Rob Browns Storyboard Link, 我成功地使它工作起来了。 它易于实现并且非常快速。


我一定会推荐它。我现在已经用它做了多个应用程序,它非常简单易用。 - BrownEye

5
最近XCode 7新增了一个功能,可以通过界面构建器在两个不同的storyboard之间进行视图控制器之间的过渡。在此之前,我们必须通过编程实现。

3
首先,将故事板分成多个单独的部分是一个好主意,这样可以节省很多麻烦(特别是如果你在团队中并且要处理故事板文件中的许多合并冲突)。
现在来回答您的问题 - 您不能必然地在两个故事板之间执行转场,但我已经成功尝试了以下解决方案:
- (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:,然后执行所需的任何转换。

希望这可以帮助您。


那么你只需要引用故事板,它就会自动转到该故事板中的初始视图控制器? - BrownEye
我创建了两个故事板,在第一个VC上放置了一个按钮并将其设置为buttonPressed。它没有链接到第二个故事板,应用程序崩溃了。我对Obj C还很陌生,所以我不确定我所做的是否正确。您发布的代码是我唯一需要的代码吗? - BrownEye
@BrownEye,这要看情况。你在第一个故事板中使用了导航控制器吗?那段代码只是展示如何从第二个故事板中获取VC。你不能在两个故事板之间进行segue,这是一个手动的过程。你遇到了什么崩溃问题? - Dan Fairaizl
我有一个TableView通过容器嵌入到普通的ViewController中,每个指南都在TableView中列出,并且每个步骤都有自己的一组视图。每个页面/步骤上都有一个选项卡样式的底部工具栏,基本上是指向4个主要页面中的每个按钮。我想拆分Storyboard,使每个Storyboard可能有4个指南或我们4个主要选项卡页面之一的一个Storyboard。目前,访问每个指南的方式是通过TableView,然后通过按钮返回。我希望能够在不同的Storyboard中跳转到指南或菜单。因为它很慢。 - BrownEye
当设置IBAction时,self.navigationController将为nil。 - Kesong Xie

2
这里有一个简单的 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)

0

Swift 3

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

"StroboardName"是你的.storyboard文件的名称。 "ViewControllerIdentifier"是故事板中视图的ID。 而"self"则是任何UIViewController。

在我的情况下,标识符是"chooseCountryViewController"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接