Получить класс/тип из объекта, хранящегося в NSArray

У меня есть массив различных объектов, таких как: 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++;
}

Но я думаю, что это неправильно. Помоги мне, пожалуйста!

0
где ошибка? можете ли вы пропустить журнал своего консоля, если он содержит какие-либо ошибки?
добавлено автор Mouhamad Lamaa, источник
Кажется, что-то не так.
добавлено автор HRM, источник
Почему ты думаешь, что это неправильно?
добавлено автор CRDave, источник
Что происходит? Вы можете использовать его UISegmentedControl * newSegment = (UISegmentedControl *) random; . Довольно уверен, что вы могли бы сказать UIView, а не id, и не уверены, что это только я, но я всегда использую responsesToSelector, а не isKindOfClass. Я уверен, что я слышал, что это было лучше ...
добавлено автор BooRanger, источник
Вы вошли в систему? NSLog (@ "class% @", NSStringFromClass ([random class]));
добавлено автор laxonline, источник
всем спасибо
добавлено автор pavel.kozlov, источник
я забываю приращение @)
добавлено автор pavel.kozlov, источник

5 ответы

Попробуй это :)

    for (id object in array) 
    {
        if ([object isKindOfClass:[UISegmentedControl class]])  
        {
             UISegmentedControl *segment = (UISegmentedControl *) object;
             segment.selectedSegmentIndex = 0;
             break;
        }
    }
4
добавлено
простое и лучшее решение: P
добавлено автор Harshit Gupta, источник
мой ответ намного эффективнее, чем ответ, который вы отметили как правильно. Решение проблемы не должно быть целью. Его цель должна решаться наиболее эффективным способом. То, что мой ответ делает. Так...
добавлено автор Harshit Gupta, источник
goooood @) Я принимаю это @)
добавлено автор pavel.kozlov, источник

Я думаю, вам не нужно воссоздавать новый объект:

//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++;
}
2
добавлено
Спасибо всем, я задохнулся, как ста свиней! Сообщение здесь правильно, но забудьте добавить incriment на мой источник ')))
добавлено автор pavel.kozlov, источник

Надеюсь, что приведенный ниже примерный код может помочь вам

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]);
}
1
добавлено

Во-первых, вы можете немного оптимизировать этот код:

Код

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

ничего не делает, просто присваивает random newSegment ( UISegmentedControl , созданный в предыдущей строке, «потерян», как только newSegment code> устанавливается на другую переменную, а UISegmentedControl - это dealloc "сразу после создания ARC - предполагается, что вы используете ARC).

Во-вторых, ваш код будет работать нормально, но вы можете сказать, что он не очень объектно ориентирован. Идея объектно-ориентированных и поздних языков привязки, таких как Objective-C, заключается в том, что вы просто отправляете любое сообщение, которое хотите получить в свой объект, и оно должно отвечать (т. Е. Иметь реализованный метод, который обрабатывает сообщение).

Поэтому, если вы хотите сделать это более объектно-ориентированным, тогда вы можете создать свои собственные подклассы рассматриваемых классов UIKit и добавить метод setup (или другое подобное имя), которое вы просто вызываете из фрагмента кода выше, без необходимости разветвляться на основе явного теста класса.

Это станет

while (i< [allChandeableSubview count]) {

  id random = [allChandeableSubview objectAtIndex:i];

  [random setup];

  i++;
}
1
добавлено
это помогло
добавлено автор pavel.kozlov, источник

Если вы разрабатываете 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;
         */
    }
}];
1
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.