1つのストーリーボードに表示されるビューが多すぎるため、実行速度が非常に遅くなります。この問題の解決策は、1つのストーリーボードを複数のストーリーボードに分割することだと言われました。ボタンを使用して、ストーリーボード1のビューからストーリーボード2のビューにセグメンテーションする方法を教えてください。
読んだものはすべて試しましたが、それでも成功しませんでした。 Rob Browns Storyboard Link を使用して動作させることができました。実装が簡単で、非常に高速に動作します
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
応答動作を維持します。
最後に、XCode 7にはこの機能が追加されており、インターフェイスビルダーを使用して2つの異なるストーリーボードのView Controllerを切り替えることができます。今まで、これをプログラムで行う必要がありました。
まず、ストーリーボードを複数の個別のストーリーボードに分割することは素晴らしいアイデアであり、多くの頭痛の種を節約します(特に、チームにいて、ストーリーボードファイルで多くのマージ競合を処理する場合)。
ここであなたの質問に答えます-2つのストーリーボード間で必ずしもセグエを実行することはできませんが、私が大きな成功を収めた1つの解決策は、次のようなことです:
- (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)
Swift 3
let vc = UIStoryboard(name: "StoryboardName", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerIdentifier") as? ExpectedViewControllerClass
self.show(vc, sender: self)
「StroboardName」は、.storyboardfileの名前です。 「ViewControllerIdentifier」は、ストーリーボード内のビューのIDです。 「self」は任意のUIViewControllerです