1

次のように ivar を開始しようとしています。

h-ファイルでこのように宣言されています

@interface MyClass: {
    UITextView *_myTextView;
}

次に、m-ファイルでこのように作成されました

- (id)init {
    self = [super init];
    if(self) {
        [self initTextView:_myTextView];
    }
    return self;
}

- (void)initTextView:(UITextView *)textView {
    textView = [[UITextView alloc] init];
    ...
}

_myTextView はその後も nil のままです。それはなぜですか、それを機能させるにはどうすればよいですか? ARCを有効にしました。

[編集]

これは機能します。皆さんありがとう!

- (id)init {
    self = [super init];
    if (self) {
        _textView1 = [self createTextView];
        _textView2 = [self createTextView];
        _textView3 = [self createTextView];
    }
    return self;
}

- (UITextView *)createTextView {
    UITextView *textView = [[UITextView alloc] init];
    ...
    return textView;
}
4

3 に答える 3

3

以下を使用して、常にインスタンス変数を参照する必要があります。

self.textView = [[UITextView alloc] init];

また、Objective-Cで特別な意味initTextViewを持つメソッドとして以外の名前を使用します。init

同じコードを使用して複数のテキストビューコントロールを初期化する場合は、次のようなコードを使用します。

- (UITextView *)createTextView
{
    UITextView *textView = [[UITextView alloc] init];
    textView.something = whatever;
    ...
    return textView;
}

そして、次のように使用します。

- (id)init {
    self = [super init];
    if(self)
    {
        self.textView1 = [self createTextView];
        self.textView2 = [self createTextView];
        ...
        self.textViewN = [self createTextView];
    }
}
于 2013-02-26T10:25:08.030 に答える
1

_myTextView[self initTextView:_myTextView];の現在の値 (nil) をinitTextView:メソッドに渡します。インスタンス変数を設定するには、ポインターへのポインターが必要です。

- (id)init {
    self = [super init];
    if (self) {
        [self setupTextView:&_myTextView];
    }
    return self;
}

- (void)setupTextView:(UITextView * __strong *)textView {
    *textView = [[UITextView alloc] init];
    ...
}

で始まるメソッドは ARCの他のメソッドと同様に動作することが期待されるため、initTextView:メソッドの名前も に変更しました。setupTextViewinitinit

于 2013-02-26T10:33:10.217 に答える
1
- (id)init {
    self = [super init];
    if(self) {
        [self initTextView];
    }
}

- (void)initTextView{
    _myTextView = [[UITextView alloc] init];
    ...
}

複数のテキスト ビューに対して initTextView を呼び出したい場合は、次のようにコーディングできます。

- (id)init {
    self = [super init];
    if(self) {
        _myTextView = [[UITextView alloc] init];
        [self initTextView:_myTextView];
    }
}

- (void)initTextView:(UITextView *)textView{
    //setup the textView
    ...
}
于 2013-02-26T10:24:22.443 に答える