3

ストーリーボードに複数のクラスでインスタンス化された1つのUIViewControllerが必要です。そのため、ストーリーボードの「クラス」フィールドを空にします(デフォルトではUIViewController?)。次に、ストーリーボードIDに「MyGenericView」を入力します。

ここにいくつかのクラスがあります:

@interface ClassA: UIViewController

@interface ClassB: UIViewController

MyGenericViewClassAとClassBでビューを構築するために必要なすべてのプロトタイプが含まれています。これが私が私のインスタンス化した方法ですClassA

ClassA *myClass = (ClassA*)[storyboard instantiateViewControllerWithIdentifier:@"MyGenericView"];

最後に、私のビューはアプリに表示されますが、私のコードはClassA呼び出されません。によって返されるオブジェクトはinstantiateViewControllerWithIdentifierUIViewControllerキャストは機能しません。

このビューをに再利用したいので、フィールド「class」にClassAを入力したくありませんClassB。ただし、ストーリーボードでこのビューを複製したくありません。

ダンノそれがあなたにとって明らかであるように思われるならば、私は私の悪い英語をお詫びします:)

ありがとう!

4

3 に答える 3

4

私はこの質問の解決策を見つけることに頭を悩ませていますが、(私が思うに)うまくいく唯一のことは、サブクラス化の代わりにデリゲートを使用することです。

つまり、ClassP、ClassC1、ClassC2の3つのクラスを実装できます。ストーリーボードをデリゲートプロトコルを実装するClassPにリンクし、(prepearForSegueに?) 提示する前に、 segue.destinationViewController(Pタイプ)のデリゲートを、プロトコルを明らかに実装するクラスClassC1またはClassC2のいずれかに設定できます。

(テストされていない)のサンプルコード:

ClassP

@protocol ClassPDelegate <NSObject>

- (void)foo;

@end

@interface ClassP : UIViewController
...
@end

ClassC1およびClassC2

#import "ClassP.h"
@property (nonatomic, weak) id <ClassPDelegate> delegate;

発信者クラス

...
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"mySegue"])
    {
        ClassC1 *classC1 = [[ClassC1 alloc] init];
        [(ClassP *)segue.destinationViewController setDelegate:classC1];
    }
}
...

私はそれがうまくいくことを願っています!ps:申し訳ありませんが、あなたの英語は私の英語よりも優れています!

于 2013-02-19T17:07:27.637 に答える
0

ストーリーボードのほとんどすべてをxibファイルに置き換えた場合にのみ、私の生活は以前よりもはるかに簡単になります。

于 2018-09-17T08:30:22.690 に答える
-1

あなたがやりたいこと、そして可能なことは必ずしも同じことではありません。キャストによって、UIViewControllerが魔法のようにClassAビューコントローラに変わることはありません。ストーリーボードのクラスをClassAまたはClassBに変更する必要があります。作成したビューをコピーして、必要な数の他のViewControllerに貼り付けることができます。それのどこが悪いんだい?

于 2013-02-19T17:04:36.123 に答える