【发布时间】:2013-09-17 15:05:06
【问题描述】:
我在一个故事板上有太多视图,这导致它运行得很慢。有人告诉我,解决此问题的方法是将一个情节提要分成多个情节提要。谁能告诉我如何通过按钮从情节提要 1 上的视图转到情节提要 2 中的视图?
【问题讨论】:
标签: ios xcode storyboard segue
我在一个故事板上有太多视图,这导致它运行得很慢。有人告诉我,解决此问题的方法是将一个情节提要分成多个情节提要。谁能告诉我如何通过按钮从情节提要 1 上的视图转到情节提要 2 中的视图?
【问题讨论】:
标签: ios xcode storyboard segue
在 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)
【讨论】:
使用 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 响应行为。
【讨论】:
(void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated 对其进行了“替换”
我尝试了我读过的所有内容,但仍然没有成功。 我已经设法使用Rob Browns Storyboard Link 让它工作了 它易于实施且运行速度非常快
【讨论】:
XCode 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];
}
只需加载另一个故事板,然后调用instantiateInitialViewController 或instantiateViewControllerWithIdentifier:,然后执行您想要的任何转换。
希望这会有所帮助。
【讨论】:
这是一个简单的 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)
【讨论】:
斯威夫特 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"
【讨论】: