我在一个故事板上有太多的观点,导致它运行得非常慢。我被告知这个问题的解决方案是将一个故事板分成多个故事板。谁能告诉我如何通过按钮从故事板1的视图到故事板2中的视图?
答案 0 :(得分:31)
答案 1 :(得分:24)
在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)
答案 2 :(得分:20)
答案 3 :(得分: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
响应行为。
答案 4 :(得分:6)
我尝试过我读过的所有内容,但仍然没有成功。 我设法使用Rob Browns Storyboard Link让它工作了 它很容易实现并且工作得非常快
答案 5 :(得分:5)
最后,XCode 7添加了此功能,您可以使用界面构建器在两个不同的故事板中区分视图控制器。直到现在,我们必须以编程方式执行此操作。
答案 6 :(得分:3)
首先,将故事板分成多个单独的故事板是一个好主意,可以省去很多麻烦(特别是如果你在团队中并处理故事板文件中的大量合并冲突)。
现在回答你的问题 - 你不能在两个故事板之间执行一个segue,但我已经取得巨大成功的一个解决方案是做这样的事情:
- (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];
}
只需加载其他故事板,然后拨打instantiateInitialViewController
或instantiateViewControllerWithIdentifier:
,然后执行您想要的任何转换。
希望这有帮助。
答案 7 :(得分: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)
答案 8 :(得分:0)
Swift 3
let vc = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerIdentifier") as? ExpectedViewControllerClass
self.show(vc, sender: self)
“StroboardName”是.storyboard文件的名称。 “ViewControllerIdentifier”是故事板中View的id。 而“self”是任何UIViewController
In my case, the identifier was "chooseCountryViewController"