0

UISegmentedControl、UILabel などのさまざまなオブジェクトの配列があります。
「objectAtIndex」を使用する場合、オブジェクト タイプ (クラス) を取得するにはどうすればよいですか?

私はそのようにしようとします:

//while my object count ok
while (i< [allChandeableSubview count]) {

  id random = [allChandeableSubview objectAtIndex:i];

  if([random isKindOfClass:[UISegmentedControl class]]){

     UISegmentedControl *newSegment = [[UISegmentedControl alloc]init];
     newSegment = random;
     newSegment.selectedSegmentIndex = 0;

   }
i++;
}

しかし、それは間違っていると思います。お願い助けて!

4

5 に答える 5

4

これを試してください:)

    for (id object in array) 
    {
        if ([object isKindOfClass:[UISegmentedControl class]])  
        {
             UISegmentedControl *segment = (UISegmentedControl *) object;
             segment.selectedSegmentIndex = 0;
             break;
        }
    }
于 2013-02-07T13:44:49.210 に答える
2

新しいオブジェクトを再作成する必要はないと思います:

//while my object count ok
while (i< [allChandeableSubview count]) {

  id random = [allChandeableSubview objectAtIndex:i];

  if([random isKindOfClass:[UISegmentedControl class]]){

     UISegmentedControl *newSegment = (UISegmentedControl*)random;
     newSegment.selectedSegmentIndex = 0;

   }
i++;
}
于 2013-02-07T13:44:23.597 に答える
1

以下のサンプルコードがお役に立てば幸いです

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

UILabel *lbl = [[UILabel alloc] init];

UIView *vi = [[UIView alloc] init];

UISegmentedControl *segment = [[UISegmentedControl alloc] init];


NSMutableArray *marr = [NSMutableArray arrayWithObjects:btn, lbl, vi, segment, nil];

for (id obj in marr)
{
    Class cls = [obj class];

    id newObj = [[cls alloc] init];

    NSLog(@"class type %@", [newObj class]);
}
于 2013-02-07T13:49:26.480 に答える
1

まず、そのコードを少し最適化できます。

コード

UISegmentedControl *newSegment = [[UISegmentedControl alloc]init];
newSegment = random;

は何もせず、代入randomするだけですnewSegment(前の行で作成された は、が別の変数を指すように設定さUISegmentedControlれるとすぐに「失われ」、ARC によって作成された直後に作成されます - ARC を使用していると仮定します)。newSegmentUISegmentedControldealloc

第 2 に、コードは問題なく動作しますが、あまりオブジェクト指向ではないと言えます。Objective-C などのオブジェクト指向および遅延バインディング言語の背後にある考え方は、オブジェクトに必要なメッセージを送信するだけで、オブジェクトは応答する (つまり、メッセージを処理するメソッドを実装する) というものです。

したがって、よりオブジェクト指向にしたい場合は、問題の UIKit クラスの独自のサブクラスを作成し、setupメソッド (または同様の名前) を追加して、上記のコード スニペットから簡単に呼び出すことができます。クラスの明示的なテスト。

それはなるだろう

while (i< [allChandeableSubview count]) {

  id random = [allChandeableSubview objectAtIndex:i];

  [random setup];

  i++;
}
于 2013-02-07T13:46:50.050 に答える
1

iOS 4+ 向けに開発している場合 (そうであると思います)、最も速い方法は、-enumerateObjectsUsingBlock説明されているhereを使用することです。

したがって、あなたの場合、次のように書きます。

[allChandeableSubview enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if ([obj isKindOfClass:[UISegmentedControl class]]) {
        UISegmentedControl *newSegment = (UISegmentedControl *)obj;

        newSegment.selectedSegmentIndex = 0;

        /* remove comment to stop enumerating
         *stop = YES;
         */
    }
}];
于 2013-02-07T14:37:37.993 に答える