1

メインのViewControllerのviewDidLoadメソッドで、プログラムでセグメント化されたコントロールを作成し、それをナビゲーションコントロールのtitleViewに追加します。

NSArray *seggieItems = [[NSArray alloc] initWithObjects:@"See Entire List",@"See Near Me", nil];
UISegmentedControl *seggie = [[UISegmentedControl alloc]initWithItems:seggieItems];
[seggie setSegmentedControlStyle:UISegmentedControlStyleBar];
[seggie setTintColor:[UIColor redColor]];
[seggie addTarget:self
           action:@selector(seggieChanged:)
 forControlEvents:UIControlEventValueChanged];


self.navigationItem.titleView = seggie;

ただし、viewWillAppearなどの別のメソッドからこのセグメント化されたコントロールにアクセスしたい場合はアクセスできません。これは宣言されていない識別子です。

    - (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [seggie setSelectedSegmentIndex:0]; //this should always be 0 for this view controller viewDidLoad method

}

XIBを使用している場合、どこからでも使用できるIBOutletがあるので、これは問題ありません。セグメント化されたコントロールのプロパティを作成しようとしましたが、インスタンス変数がローカル変数を非表示にするため、これは間違ったアプローチである必要があります。

これについて行くための最良の方法は何ですか?これがばかげた質問である場合は、お詫び申し上げます。私はiOSにかなり慣れていないので、現在2冊の本の半分くらいです。Googleで回答が見つからなかったか、StackOverflowを検索しました。助けていただければ幸いです。これが本当に単純なもので、私が見逃しているものである場合は申し訳ありません。ありがとう

4

5 に答える 5

3

それをプロパティにするのが正しいアプローチです。これを行って、説明したマスク警告が表示された場合でも、viewDidLoadメソッドでseggie変数を宣言している可能性があります。self.seggieその宣言を削除し、代わりに常に参照してくださいseggie。問題はありません。

宣言とは、この行を意味します。

UISegmentedControl *seggie = [[UISegmentedControl alloc]initWithItems:seggieItems];    

そのはず

self.seggie = [[UISegmentedControl alloc]initWithItems:seggieItems];
于 2012-05-12T08:03:17.630 に答える
3

これを行うには2つの方法があります:-

1> .hファイル(グローバル)でUISegmentedControlのオブジェクトを宣言し、他のクラスからアクセスする場合を除いて、同じクラスにプロパティは必要ありません。

2>親ビューのサブビューを反復処理してUISegmentedControlを取得し、次のようにOPe​​rationsから実行するようにタイプキャストできます。-

NSArray *subviewss=[self.view subviews];
for(int i=0;i<[subviewss ;i++])
{
if([[subviews objectAtIndex:i] isKindOfClass:[UISegmentedControl class]])
{
UISegmentedControl *segmentControl= (UISegmentedControl *) [subviewss objectAtIndex:i];
[segmentControl setSelectedSegmentIndex:0];

}
}

ただし、上記のループコードは、ビューコントローラにサブビューとしてセグメント化されたコントロールが1つしかない場合にのみ機能します。それ以外の場合は、クラスタイプUISegmentedControlのコードにぶつかります。

于 2012-05-12T11:14:47.040 に答える
2

UISegmentedControl *seggie;このコード行を .h(header) ファイルに入れるか、 Global にします!

ローカルで作成されたオブジェクトを他のメソッドで使用することはできません。ローカルおよびインスタント変数。これは Java 用ですが、主なアイデアを理解していただければ幸いです。

于 2012-05-12T07:59:08.523 に答える
2

上記の提案オプションは適切です。プロパティまたはクラス全体/グローバル変数を作成します。プロパティまたはクラス全体/グローバル変数を定義したくない場合は、もう1つのアプローチ-

のようなアクセス制御 -

for (int index = 0; index < [self.view.subviews count]; index++) {
    if([[self.view.subviews objectAtIndex:index] isKindOfClass:[UISegmentedControl class]]) {
        UISegmentedControl *seggie = (UISegmentedControl *) [self.view.subviews objectAtIndex:index];
        [seggie setSelectedSegmentIndex:0];
    }
}

コメントではありませんが、一般的なアドバイス

はい、これは確かにビューを取得する最も非効率的な方法です。

まず、高速列挙を使用する場合、少なくとも繰り返し使用を取り除くことができます

[self.view.subviews objectAtIndex:index]

電話、これは本当に

[[[self view] subviews] objectAtIndex:index]

メソッドのディスパッチは高速ですが、コードが実際に何をしているかを考えるべきではないという意味ではありません。

複数のコントロールはすべて同じように扱われるため (例: 0 に設定)、コードは複数のコントロールを考慮しません。

また、目的のオブジェクトを見つけた後は、このループを早期に終了することもできません。ビューをサイクリングすることを主張した場合は、少なくともうまくやってください -

for (UISegmentedControl *seggie in [self.views.subviews]) { 
    if ([seggie isKindOfClass:[UISegmentedControl class]]) { 
        seggie.selectedSegmentIndex = 0; 
        break; 
    } 
}
于 2012-05-12T08:16:42.080 に答える
1

あなたはどちらかのプロパティを作成する必要があります

UISegmentedControll *seggie

ヘッダーファイルで、または配列をグローバルにします。

それがあなたにとって選択肢がない場合、私はそれを使用してアクセスしてみます

UISegmentedControl * temp = self.navigationController.titleView;
[temp setSelectedSegmentIndex:0];
于 2012-05-12T08:06:15.507 に答える