1 つのストーリーボードにビューが多すぎるため、実行が非常に遅くなります。この問題の解決策は、1 つのストーリーボードを複数のストーリーボードに分割することだと言われました。ボタンを使用して、ストーリーボード 1 のビューからストーリーボード 2 のビューに切り替える方法を教えてください。
9 に答える
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)
セグエ(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
読んだことはすべて試しましたが、まだ成功しませんでした。Rob Browns Storyboard Linkを使用してなんとか機能させることが できました 実装は簡単で、非常に高速に動作します
まず第一に、ストーリーボードを複数の個別のものに分割することは素晴らしいアイデアであり、多くの頭痛の種を軽減します (特に、チームに所属していて、ストーリーボード ファイルで多数のマージ競合を処理している場合)。
あなたの質問に答えるために-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)