0

私は iOS > 5.0 用のアプリを開発しており、Xcode 4.6.2 を使用しています。これには多くの要素UIViewが含まれています。UIKit

例を挙げると、想像どおりRadioButtonの基本クラスを持つカスタムクラスがあります。のサブクラスであるUIButtonというクラスもあります。CRTLabelUILabel

po [view subviews]コンソールにいるとき、私は得ました

$0 = 0x0754c4d0 <__NSArrayM 0x754c4d0>(
<CRTLabel: 0x857f120; baseClass = UILabel; frame = (10 10; 360 35); text = '2- Sizce evet mi hayır mı...'; clipsToBounds = YES; userInteractionEnabled = NO; tag = 1; layer = <CALayer: 0x857f1b0>>,
<RadioButton: 0x857f520; baseClass = UIButton; frame = (20 65; 44 44); opaque = NO; layer = <CALayer: 0x857f5e0>>,
<CRTLabel: 0x857f800; baseClass = UILabel; frame = (84 65; 600 44); text = 'Evet'; clipsToBounds = YES; userInteractionEnabled = NO; tag = 122; layer = <CALayer: 0x857f740>>,
<RadioButton: 0x857fb50; baseClass = UIButton; frame = (20 139; 44 44); opaque = NO; tag = 1; layer = <CALayer: 0x857fa60>>,
<CRTLabel: 0x857fd60; baseClass = UILabel; frame = (84 139; 600 44); text = 'Hayır'; clipsToBounds = YES; userInteractionEnabled = NO; tag = 122; layer = <CALayer: 0x857fc60>>
)

ビューのすべてのサブビューを反復処理する for ループがあります。だから私はこのコードを使用します、

for(RadioButton *radioButton in view.subviews)
{
     if(radioButton.selected == YES && radioButton.tag == 0)
     // Does something
     else if(radioButton.selected == YES && radioButton.tag == 1)
     // Does something
}

選択したプロパティがないと言ってアプリがクラッシュしました。メソッドを使用isKindOfClassして、radioButton の種類をテストしましRadioButtonた。だから、それが種類のない場合、すべてのサブビューを反復することがわかりましたRadioButton。さらに説明すると、現在のサブビューが であってもCRTLabel、次の行にステップオーバーし、CRTLabelというプロパティがないselectedため、クラッシュします。

したがって、私の期待は、そうでないすべてのクラスを排除することであり、sRadioButtonのみを反復しRadioButtonます。

だから私の質問はそれwhat is the advantage of specifying a custom class in foreach loop in Objective-cですか?idid が一種かどうかを確認するよりも、常にループで使用できますRadioButton

4

2 に答える 2

0

isKindOfClass割り当てる前にテストする

for(id radioButton in view.subviews)
{
    if(radioButton isKindOfClass: RADIOBUTTON)
    { 

     if((RADIOBUTTON *)radioButton.selected == YES && (RADIOBUTTON *)radioButton.tag == 0)
     // Does something
     else if((RADIOBUTTON *)radioButton.selected == YES && (RADIOBUTTON *)radioButton.tag == 1)
     // Does something
    }
}
于 2013-05-24T10:58:18.230 に答える
0

view.subviews配列サブビューを返します。のサブビューであるようなラジオ ボタンとラベルの両方が含まれますview

  for(RadioButton *radioButton in view.subviews) //  logically wrong since subView can be anything button,label...

  for(UIView *subView in view.subviews)
  { 
     // Iterate through all subViews

     if([subView isKindOfClass:[RadioButton class]])
      {
        //safe no crash
      }
  }

特定のビュー (radioButton) のみを反復処理することはできません。あなたが言ったように、すべてのビューを繰り返し処理しisKindOfClass、特定のサブビューを識別するために使用できます。それ以外の場合は、ビューのタグプロパティを中継して反復を削除する必要があります。

于 2013-05-24T11:00:17.457 に答える