1

iOS(またはより正確にはObjective-C)とプロパティについて質問があります。UISegmentedControlを備えたUIViewがあり、デフォルトでは3つのセグメントがあります。パラメータを受け入れるメッセージがあり、このパラメータに基づいて、セグメントの1つを削除したい場合があります。UIView AIでこれを行います:

MyViewController *myview = [[[MyViewController alloc] initWithNibName:@"MyViewController" nib:nil] autorelease];
[[self navigationController] pushViewController:myview animate:YES];
[myview showItem:item];

UIView Bでは、これはshowItemで発生します。

-(void) showItem:(Item*)item{
    if (item.removeSegment){
        [segmentControl removeSegmentAtIndex:0 animate:NO];
    }
}

セグメントは、ナビゲーションコントローラーにプッシュした後でshowItemを呼び出したときにのみ削除されることに気付きました。これらの2行を入れ替えると、最初にshowItemを呼び出してからビューをプッシュしますが、UISegmentedControlには2つではなく3つのセグメントがあります。

これは間違っているように感じます。誰かが正しい順序で2つのメッセージを呼び出さないと、私のコードが壊れてしまうのは悪い習慣のようです。これを行うためのより良い方法はありますか?私は使用できるある種のプロパティライフサイクルを見てきました。ActionScript3からこれに非常に精通していますが、このテーマについては何も見つかりませんでした。

(余談ですが、AS3ではプロパティを作成し、セッターでは画面コントロールを操作せずにInvalidePropertiesを呼び出します。オブジェクト全体と子コントロールが作成されると、オーバーライドされたメソッドCommitPropertiesが呼び出されます。CommitPropertiesでチェックします。プロパティ値が変更され、これがセグメントを削除する場所である場合。)

4

2 に答える 2

2

このようなことを行う一般的な方法は、でItem *itemプロパティを作成し、作成MyViewController時にそれを設定することmyviewです。したがって、コードは次のようになります。

MyViewController *myview = [[[MyViewController alloc] initWithNibName:@"MyViewController" nib:nil] autorelease];
myview.item = item;
[[self navigationController] pushViewController:myview animate:YES];

MyViewController次に、そのメソッドでそのプロパティを使用してviewWillAppear:、独自のセグメントコントロールを構成します。

于 2012-06-21T14:14:57.793 に答える
0

あなたが犠牲になっているのは、ビューの遅延ロードのために myview.view が参照されるまで myview->segmentControl が存在しないことだと思います。

-(void) showItem:(Item*)item{
    [self view]; // NO OP TO FORCE LOAD!!
    if (item.removeSegment){
        [segmentControl removeSegmentAtIndex:0 animate:NO];
    }
}

あなたのために働くはずです。お役に立てれば!

于 2012-06-21T15:24:41.997 に答える