0

タイトルは私が必要だと思うものですが、一歩戻ります。iOS アプリで特定のものを処理するクラスを作成したいと考えています。このクラスはUIViewcontrollers、iOS アプリで複数回呼び出される可能性があります。クラスはUIView、ユーザー入力のためにある段階で を表示する必要がある場合があります。だから私の質問は、どののがそれを呼び出しているのかUIViewわからないときに、どうすれば a を表示できますか? このクラスから何を追加できますか?subclassUIViewControllerUIView

クラスが現在のクラスを見つけるUIViewControllerか、呼び出し元のサブクラスUIViewControllerが自分自身をクラスに渡して、クラスが認識できるようにする2つの可能な答えがあると思います。

これはどのように行われることになっていますか。

助けてくれてありがとう。

4

3 に答える 3

0

なぜあなたはこれにブロックを使わないのですか?BaseViewController.h:

@property (copy) void (^addViewBlock)();
- (IBAction)showViewWhenNeeded;

BaseViewController.m:

- (IBAction)showViewWhenNeeded
{
    if (self.addViewBlock)
        self.addViewBlock();
}

そして、子クラスで、そのブロックのアクションを設定し、ビューを表示する必要があると感じたときにメソッドを呼び出します。

ChildViewController.m

// within some method, propably init or smth
[self setAddViewBlock:^{
    [self.vied addSubView:...];
}];

// when need to actually add the view
[self showViewWhenNeeded];
于 2013-03-11T20:38:46.560 に答える
0

プロトコルとサブクラスの使用に関する @ericleaf のコメントを詳しく説明します。次のように尋ねているようです。

UIViewController サブクラス内でビューを表示する、再利用可能な汎用クラスを作成するにはどうすればよいですか?

これを行うための優れた方法は、ジェネリック クラスでプロトコルを定義し、View Controller サブクラスでこのプロトコルをサポートすることです。プロトコルは、カスタム クラスがそのdelegate、この場合はUIViewControllerサブクラスと通信するためのインターフェイスを定義します。プロトコル以外に、オブジェクトは互いの実装について何も知る必要はありません。

カスタム オブジェクトがデリゲート内でビューを表示できるようにするために必要な情報はすべて、プロトコル メソッドを介して渡されます。プロトコルの詳細は、ニーズに基づいて自由に決めることができます。カスタムオブジェクトでデリゲートに情報を「尋ねる」ことができます (たとえば、どのビューにサブビューを配置する必要がありますか?)、またはプロトコルでデリゲートに情報を提供し、デリゲートに処理させることができます (たとえば、ここにサブビューがあります)。好きな場所に置くことができます)。

SO や他の場所で利用できるプロトコルに関する優れたドキュメントがたくさんあります。これはすでに十分に長いので、例をかなり単純にしました。

プロトコル定義を含むカスタム クラス .h ファイル

// my custom class that adds adds a view to a view controller that supports it's protocol

// forward class definition for the protocol
@class MyAwesomeObject;

@protocol MyAweseomeObjectDelegate <NSObject>
- (UIView *)viewForMyAwesomeObject:(MyAwesomeObject *)awesomeObject;
@end

// this could be defined such that the delegate *must* be a UIViewController. I've left it generic.
@interface MyAwesomeClassObject : NSObject
@property (nonatomic, weak) id <MyAwesomeObjectDelegate> delegate;
@end

カスタム クラス .m ファイル

// MyAwesomeObject.m

#import "MyAwesomeObject.h"

@implementation MyAwesomeObject

// this is a dumb example, but shows how to get the view from the delegate
// and add a subview to it
- (void)presentViewInDelegate
{
    UIView *containingView = [self.delegate viewForMyAwesomeObject:self];
    if (containingView) {
        UIView *subview = [[UIView alloc] initWithFrame:containingView.bounds];
        subview.backgroundColor = [UIColor redColor];
        subview.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
        [containingView addSubview:subview];
    }
}

カスタム オブジェクトを使用した MyViewController .h

// MyViewController.h

@import "MyAwesomeObject.h"

@interface MyViewController : UIViewController <MyAwesomeObjectDelegate>
@property (nonatomic, strong) MyAwesomeObject *awesomeObject;
@end

カスタム オブジェクトを使用した MyViewController .m

// MyViewController.m

@import "MyViewController.h"

@implementation MyViewController

- (void)init
{
    self = [super init];
    if (self) {
        _awesomeObject = [[MyAwesomeObject alloc] init];
        _awesomeObject.delegate = self;
    }
    return self;
}

// MyAwesomeObjectDelegate
- (UIView *)viewForMyAwesomeObject:(MyAwesomeObject *)awesomeObject
{
    return self.view;
}
于 2013-03-11T19:39:38.560 に答える
0

クラスを文字列に取得して比較できます。

たとえば、カスタムUIViewControllerサブクラスがCustomViewConであり、UIViewControllerオブジェクト参照がmyUnknownClassObjectであると仮定すると、次のようになります。

NSString *classString = NSStringFromClass([myUnknownClassObject class]);

次に、次のことができます。

if([classString isEqualToString:@"CustomViewCon"]){
    //do something like maybe present a particular view
    myUnknownClassObject.view = myCustomView; //or anything..
}

同様に、任意のクラスを確認できます。

編集:コメントからの提案によると、次のこともできます(より良い方法):

if([[myUnknownClassObject class] isKindOfClass:[CustomViewCon class]]){
    //same as before
}
于 2013-03-11T18:49:01.053 に答える