32

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

4

9 回答 9

35

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

在此处输入图像描述

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

在此处输入图像描述

于 2015-10-20T20:42:37.883 回答
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)
于 2014-12-03T07:31:24.817 回答
27

添加对另一个故事板的引用 - Apple 开发人员文档

在此处输入图像描述

在此处输入图像描述

于 2015-12-07T09:23:51.790 回答
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响应行为。

于 2014-01-25T13:14:36.050 回答
6

我尝试了我读过的所有内容,但仍然没有成功。我已经设法使用Rob Browns Storyboard Link让它工作 它很容易实现并且工作得非常快

于 2013-09-21T14:14:34.947 回答
5

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

于 2015-07-08T08:15:56.143 回答
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:执行您想要的任何转换。

希望这可以帮助。

于 2013-09-13T03:24:55.210 回答
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)
于 2015-07-06T07:00:48.053 回答
0

斯威夫特 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”

于 2017-06-29T03:29:06.640 回答