0

「スーパー オブジェクト」のいくつかを、単一の (または少なくとも限定された) 責任を持つ、より管理しやすいクラスに分割しようとしています。

私が遭遇した問題の 1 つは、UIBarButtonItem の特定のインスタンスのオブジェクトを作成することです。現在のクラスでは、最初にUIButtonを定義し、次にそのボタンのアイコンとして機能するすべての画像をサブビューとして定義します(たとえば、ボタンはデバイスへのアクセス/制御を表し、ボタン画像を使用してそのデバイスの現在の信号強度)。また、そのボタンは、デバイス オブジェクトからの NSNotifications をリッスンして、信号強度の変化、またはデバイスの切断を表します。ボタンを押すと、切断するようにデバイスにメッセージが送信されます。このコードはすべて、RootViewController のプロパティとして完全に機能するようになりました。ただし、ボタンは複数のクラスで共有されているため、独自のクラスに引き出したいと考えており、不要なメソッドでコントローラーが乱雑になっています。

以下のようなinitで別のクラスを作ってみました。ただし、ボタンに使用される自己が [UIBarButtonItem alloc] によって最終的に作成される自己と同じではないため、これは機能しません。また、NSNotification またはボタンの押下のいずれかが「自己」のセレクターにメッセージを送信しようとすると、これは機能しません。 、そのオブジェクトは既に割り当て解除されています。問題は、オブジェクトのプロパティ (現在は RootViewController 用) ではなく、別のクラスの単なるインスタンスであるオブジェクト (クラスによって定義されている) を作成する方法がわからないことです。

私の問題の編集と追加の説明

MyClass は現在、UIBarButtonItem のサブクラスです。ただし、[[MyClass alloc] initWithCustomView:] のように使用するつもりはありません。[MyClass alloc] init] だけでカスタム ビューを完全に作成する必要があります。つまり、このクラスの要点は、このボタンがそれ自体を作成し、そのサブビューを管理し、適切なアクションを実行するために必要なすべてを完全に含めることです。押されたとき。([MyClass setupButton] のようなパブリック メソッドと UIBarButtonItem 型のパブリック プロパティを使用して、MyClass を NSObject にすることは簡単にできます。ただし、クラスはボタンを作成するためだけに存在し、ボタンではないため、これは間違っているように見えます。自体。)

@interface MyClass : UIBarButtonItem
@end

@implementation MyClass
- (id)init {
    if (self = [super init]) {

        UIImage *defaultButton = [[UIImage imageNamed:@"...
        UIImage *defaultButtonPressed = [[UIImage imageNamed:@"....
        UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 30)];
        [button setBackgroundImage:defaultButton forState:UIControlStateNormal];
        [button setBackgroundImage:defaultButtonPressed forState:UIControlStateHighlighted];
        [button addTarget:self action:@selector(deviceButtonPressed) forControlEvents:UIControlEventTouchUpInside];

        //Then several UIImageViews that are added as subviews of the button, initially hidden

        //Then set up the NSNotification listener

        //Finally
        self = [[UIBarButtonItem alloc] initWithCustomView:button];
    }

    return self;
}

//Then several functions to handle hiding and unhiding the subviews depending on the received device notifications, and a function to handle the button press and sending the message back to the device.
4

2 に答える 2

1

UIBarButtonItemメソッドでインスタンスを作成するのではなく、拡張したいようですinit。クラス宣言 (クラスの .h ファイル内) を次から変更してみてください。

@interface MyClass : NSObject

これに:

@interface MyClass : UIBarButtonItem

次に、メソッドに戻りselfますinit。通常、値を設定selfすることはお勧めできません。

ここで何が起こっているのかわからない場合は、UIBarButtonItemのサブクラスを作成しています。これにより、サブクラスはスーパークラスの機能を拡張できます。混乱している場合は、オブジェクト指向言語のサブクラス化/クラス継承を調べて、何が起こっているのかを理解する必要があります。このガイドでは、クラスが Objective-C でどのように機能するかについて説明します。

于 2013-02-12T04:58:52.333 に答える
1

これは Cocoa での初期化の仕組みではありません。Cocoa Core Competencies ガイドの「初期化」をお読みください。

initこのメソッドが実行されるとき、オブジェクトはすでに割り当てられています。selfポインターを別の割り当てに再割り当てしないでください。

クラスは、最初にそのスーパークラスの指定された初期化子self = [super initWithWhatever:obj];を呼び出してから、独自のプロパティを設定する必要があります。

于 2013-02-12T05:00:26.087 に答える