78

私の目的は、タブ付きアプリケーションを作成することであり、各タブのビューは個別のストーリーボードで構築されます。

ストーリーボードのスクリーンショット

私のメインストーリーボードはタブビューです。

次に、2 つの View Controller を使用してセカンダリ ストーリーボード (storyboard#2) を作成します。最初のView Controller(初期としてもチェックされています)にはボタンがあり、2番目のビューにセグエ(モーダル)します。最初のビュー コントローラー

ストーリーボード#2 の loadView をサブクラス化してオーバーライドすることで、なんとかビューをロードできました。 loadView オーバーライド

これがシミュレーターの出力です。

シミュレーター

「クリックしてください」ボタンをクリックすると、EXC_BAD_ACCESS. セグエが機能しません。2 番目のストーリーボードが完全に読み込まれていないようです。

誰かがこれを以前に実行しようとしたことがありますか? SkillMaster.net の youtube ビデオがありますが、セグエがセカンダリ ストーリーボードで機能しているかどうかを示していません。ビデオはこちら: http://youtu.be/D4_twoYvB4M

ご意見とご協力ありがとうございます。

スクリーンショット:

4

9 に答える 9

82

これらは、複数のストーリーボードで見た中で最高の記事です。

この男は、コードで新しいストーリーボードを作成する方法を教えてくれるだけでなく、

  • 実際には複数のストーリーボードを推奨しています (よりモジュール化されたコード)
  • いつ xib とストーリーボードを使用するかについて説明します (xib はビューを保持し、storboard はコントローラーに基づいています)
  • githubでストーリーボードとセグエをリンクするためのクラスを提供します

複数のストーリーボードの主な欠点は、通常、それらをセグエにリンクできないため、この最後の点が重要であることに注意してください。

ここで議論されているものも参照してください

于 2012-10-01T19:19:46.123 に答える
44

OPは彼の質問を編集して答えを含めました:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"HelpStoryboard" bundle:nil];
UIViewController* initialHelpView = [storyboard instantiateInitialViewController];

initialHelpView.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:initialHelpView animated:YES];

もちろん、2つのストーリーボードとそのビュースタックがメモリにある可能性があるため、これをどこから呼び出すかは意味があります。したがって、他のストーリーボードのビューコントローラの外部からこのコードを呼び出す場合はおそらく最良です。

于 2011-12-15T07:25:48.547 に答える
19

Rhubarb によって提案されたRBStoryboardLinkアプローチを調べました。この実装は、奇妙に見えるビュー コントローラーのプロパティを置き換えます。これを回避する方法を見つけたと思います。これがデモプロジェクトです。

ナビゲーション コントローラー

ナビゲーション コントローラは、参照されたビュー コントローラをルートとして設定するだけです。このようなView Controllerの実装は次のようになります。

@interface ExternNavigationController : UINavigationController

@property (strong, nonatomic) NSString *storyboardName;
@property (strong, nonatomic) NSString *sceneIdentifier;

@end

@implementation ExternNavigationController

- (void)awakeFromNib
{
    NSAssert(self.storyboardName, @"storyboardName is required");

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:self.storyboardName bundle:nil];
    UIViewController *vc = self.sceneIdentifier
        ? [storyboard instantiateViewControllerWithIdentifier:self.sceneIdentifier]
        : [storyboard instantiateInitialViewController];

    self.viewControllers = @[vc];
}

@end

コントローラを表示

問題は、外部ストーリーボードで定義されたビュー コントローラーをプッシュするときに始まります。これは、プロパティがコピーされる場合です。これの代わりに、偽の宛先コントローラーを外部ストーリーボードからの実際のコントローラーに置き換えるカスタム セグエを実装できます。

@interface ExternStoryboardSegue : UIStoryboardSegue

@end

@implementation ExternStoryboardSegue

- (id)initWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(ExternViewController *)destination
{
    NSAssert(destination.storyboardName, @"storyboardName is required");

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:destination.storyboardName bundle:nil];
    UIViewController *vc = destination.sceneIdentifier
        ? [storyboard instantiateViewControllerWithIdentifier:destination.sceneIdentifier]
        : [storyboard instantiateInitialViewController];

    return [super initWithIdentifier:identifier source:source destination:vc];
}

- (void)perform
{
    [[self.sourceViewController navigationController] pushViewController:self.destinationViewController animated:YES];
}

@end

ExternViewController はプレースホルダーとして使用され、置換に必要なプロパティ (storyboardName および sceneIdentifier) が含まれています。

@interface ExternViewController : UIViewController

@property (strong, nonatomic) NSString *storyboardName;
@property (strong, nonatomic) NSString *sceneIdentifier;

@end

@implementation ExternViewController

@end

これらのプロパティとプレースホルダー ビュー コントローラーのカスタム クラスを設定する必要があります。また、View Controller と ExternStoryboardSegue をリンクします。

IB スクリーンショット

于 2013-10-31T09:15:38.937 に答える
16

XIB ファイルの 1 つから、GUI のより複雑な部分に移動しています。この部分では、ストーリーボードを使用しています。したがって、XIB のボタンはストーリーボードに移動します。私が持っているコードは次のとおりです。

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MyStoryboardIdentifier" bundle:nil];
UIViewController* myStoryBoardInitialViewController = [storyboard instantiateInitialViewController];

[self.navigationController pushViewController:myStoryBoardInitialViewController animated:YES];

これにより、StoryBoard が正常にビューにプッシュされます。上記のコードは、ボタンの「Touch Up Inside」アクションから呼び出されます。

于 2012-04-24T08:49:35.820 に答える
7

Apple のドキュメントによると、複数のストーリーボードがある可能性があります。残念ながら、彼らはそれを行う方法について実際の詳細には触れていません. お気づきのように、Interface Builder は役に立たないため、コードで行う必要があります。これは、XIB をロードするのと同じように機能します。

[UIStoryboard storyboardWithName:@”MyNewStoryboard” bundle:myBundle]

そうは言っても、コメントで言ったように「1つの大きな/肥大化したストーリーボードが必要ない」場合は、XIBが本当に適しています。その「大きさ」が利点です。VC 間のすべての遷移が 1 か所に配置されます。複数のストーリーボードを用意することで、アプリを通じて複数の異なる無関係なフローをサポートできるようになります。たとえば、1 つのストーリーボードを複雑な構成フローに、もう 1 つをメインのユーザー フローに使用できます。

于 2011-11-28T16:17:57.883 に答える
2

performSegueWithIdenitfier の呼び出しで使用する 2 番目のストーリーボードに名前付きセグエがある場合、ソース ViewController の [ID] タブで [ストーリーボード ID] フィールドを設定する必要があることがわかりました。

たとえば、別の VC に「segue1」というセグエを持つ「ViewController1」という VC を与えた場合、「ViewController1」の「ストーリーボード ID」を任意のもの (「viewC1」など) に設定すると、ViewController1.m で次のことができます。 [self performSegueWithIdentifier:@"segue1" sender:self] を使用します。

于 2013-02-23T19:06:44.923 に答える
1

このタスクを達成するには、以下の手順に従います。

ステップ 1 : コンポーネント内を検索Storyboard Referenceします (スクリーン ショットを参照) 。

ステップ 2 : 新しいストーリーボード参照を選択します。(スクリーンショット参照)

ステップ 3 : 新しいストーリーボード名と初期ビュー コントローラーの識別子の識別子を提供します (スクリーン ショットを参照)。

ここに画像の説明を入力

ビルドして実行します。それが動作します。

于 2018-05-23T05:07:42.970 に答える