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

首先,您可以稍微优化该代码:

编码

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

什么都不做,只是分配randomnewSegmentUISegmentedControl上一行中创建的值一旦newSegment设置为指向另一个变量,就会“丢失”,并且在由 ARC 创建后立即UISegmentedControldealloc'ed - 假设您使用 ARC)。

其次,您的代码可以正常工作,但您可以说它不是非常面向对象的。面向对象和后期绑定语言(如Objective-C)背后的理念是,您只需向您的对象发送您想要的任何消息,并且它应该响应(即,实现一个处理消息的方法)。

因此,如果您想更加面向对象,那么您可以创建自己的 UIKit 类的子类,并添加一个setup方法(或类似名称),您只需从上面的代码片段中调用该方法,而无需基于类的显式测试。

它会变成

while (i< [allChandeableSubview count]) {

  id random = [allChandeableSubview objectAtIndex:i];

  [random setup];

  i++;
}
于 2013-02-07T13:46:50.050 回答
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

如果您正在为 iOS 4+ 开发(我猜您是),那么最快的方法是使用这里-enumerateObjectsUsingBlock的解释。

所以,在你的情况下,我会写如下:

[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 回答