web-dev-qa-db-ja.com

あるストーリーボードから別のストーリーボードにセグエしますか?

1つのストーリーボードに表示されるビューが多すぎるため、実行速度が非常に遅くなります。この問題の解決策は、1つのストーリーボードを複数のストーリーボードに分割することだと言われました。ボタンを使用して、ストーリーボード1のビューからストーリーボード2のビューにセグメンテーションする方法を教えてください。

26
BrownEye

読んだものはすべて試しましたが、それでも成功しませんでした。 Rob Browns Storyboard Link を使用して動作させることができました。実装が簡単で、非常に高速に動作します

6
BrownEye

Xcode 7では、ストーリーボードリファレンスを選択できます

enter image description here

目的のストーリーボードとコントローラーを設定します

enter image description here

32
Nycen

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)
24
metamorph2
22

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 *cellsenderとして使用され、デフォルトTableViewController応答動作を維持します。

9
Nocross

最後に、XCode 7にはこの機能が追加されており、インターフェイスビルダーを使用して2つの異なるストーリーボードのView Controllerを切り替えることができます。今まで、これをプログラムで行う必要がありました。

5
Udit Agarwal

まず、ストーリーボードを複数の個別のストーリーボードに分割することは素晴らしいアイデアであり、多くの頭痛の種を節約します(特に、チームにいて、ストーリーボードファイルで多くのマージ競合を処理する場合)。

ここであなたの質問に答えます-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:のいずれかを呼び出してから、好きなトランジションを実行してください。

お役に立てれば。

3
Dan Fairaizl

簡単な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)
2
Mingebag

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です

私の場合、識別子は「chooseCountryViewController」でした

0
al_mota