2012-05-12 11 views
1

私のメインView Controllerの私のviewDidLoadメソッドでは、私はプログラム化されたセグメント化されたコントロールを作成し、それを私のナビゲーションコントロールのtitleViewに追加します。コントロールをプログラムでviewDidLoadに追加すると、他のメソッドからどのようにアクセスできますか?

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で答えを見つけることができませんでした。何か助けていただければ幸いです。本当にシンプルなものであれば、すみません。ありがとう

+0

「スコープ」はgooglingしてみてください。これは基本的に変数の寿命です。 – 11684

答えて

3

これをプロパティにするのは正しいアプローチです。それを行い、あなたが記述したマスク警告を得るなら、あなたはおそらくviewDidLoadメソッドでseggie変数を宣言しているでしょう。その宣言を削除し、seggieの代わりに常にself.seggieを参照すると、問題ありません。あなたのヘッダファイルで

UISegmentedControll *seggie 

の財産を作る、またはメイクのいずれかなくちゃ

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

それは

self.seggie = [[UISegmentedControl alloc]initWithItems:seggieItems]; 
+0

助けてくれてありがとうございました。私はseggieを不動産にした後、私の宣言を変更しました。それは魅力のように機能します。これらのことを私の頭の中にもう少し包み始め、もう一度感謝します。 – scotts7777

2

このUISegmentedControl *seggie;コードを.h(ヘッダー)ファイルに入れるか、グローバルにしてください!

他の方法でローカル作成オブジェクトを使用することはできません。 Local and Instant Variable.ItはJava用ですが、主なアイデアを理解していただければ幸いです。

+0

ありがとう、私は今何が間違っていたのか理解しています。私はそれをローカルに作成されたセグメント化されたコントロールからプロパティに切り替えました。そして今、私はどのメソッドからでもアクセスできます。助けてくれてありがとう – scotts7777

1

次のようになります宣言で

私はこの行を意味します配列グローバル。それはあなたのためのオプションがありますしない場合

は、私が

UISegmentedControl * temp = self.navigationController.titleView; 
[temp setSelectedSegmentIndex:0]; 
2

上記提案の選択肢が優れている使用してそれにアクセスしてみてください、いずれかのプロパティまたはクラスワイド/グローバル変数を作成します。 もう一つのアプローチは、プロパティまたはクラスワイド/グローバルvariable-

アクセス制御のような定義したくない場合は - 本当に

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] 

コール、の繰り返し使用を取り除くことができ、高速列挙体を使用する場合は高速ですが、それはdoesnのあなたのコードが実際に何をしているのか考えるべきではありません。

あなたのコードでは、複数のコントロールがすべて同じように扱われるため(たとえば0に設定されているため)、コントロールは考慮されません。

あなたが後のオブジェクトを見つけたら、このループからの早期終了もありません。 - あなたは、少なくともビューを巡回を主張した場合、うまくそれを行う

for (UISegmentedControl *seggie in [self.views.subviews]) { 
    if ([seggie isKindOfClass:[UISegmentedControl class]]) { 
     seggie.selectedSegmentIndex = 0; 
     break; 
    } 
} 
+0

クラスワイド変数が意味するものは正確にはわかりませんが、グローバル変数はこの場合は最適ではありません。プロパティや古い学校のインスタンス変数は、それを行うための従来の方法です。これは、プラットフォームを初めて使用する人にとっては悪いアプローチではありません。 – Monolo

+0

@Monolo - Agree ...最良のアプローチは、プロパティまたはインスタンス変数を使用することですか? – rishi

+0

私は、この場合のプロパティとインスタンス変数の選択は、特にインスタンス変数のメモリ管理を担当するARCの場合、個人的な好みの問題であると思います。個人的には、.mファイルで宣言されたインスタンス変数を選択して、パブリックインターフェイスから非表示にします。しかし、あなたがそれをクラスまたはグローバル変数にしない限り、あなたは良いです。 – Monolo

3

あなたがこれを行うことができ、2つの方法があります: -

1>はどちらかグローバル(.hファイルにUISegmentedControlためのオブジェクトを宣言)他のクラスからアクセスしない限り、同じクラスにはプロパティは必要ありません。 は>あなたはparentviewのサブビューを反復処理し、UISegmentedControlを取得し、それは、などの操作、perfromに型キャストすることができます -

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が分割されている場合にのみWRKますループをあなたのviewcontrollerのサブビューとしてそれ以外の場合は、UISegmentedControlクラス型のものにバンプします。

関連する問題