Использование значения строки для определения экземпляра класса - PullRequest
3 голосов
/ 26 мая 2009

У меня есть оператор switch, похожий на этот:

    switch (number)
    {
        case 1:
            if (imageView1.hidden == NO)
            {
                imageView1.hidden = YES;                    

            } else 
            {
                imageView1.hidden = NO;
            }


            break;
        case 2:
            if (imageView2.hidden == NO)
            {
                imageView2.hidden = YES;


            } else 
            {
                imageView2.hidden = NO;
                            }

            break;

И так далее, и так далее.

Мой вопрос заключается в том, как использовать строку со значением, скажем «imageView1», и использовать ее для доступа к экземпляру моего класса imageView, вместо того, чтобы использовать разные регистры для каждого экземпляра imageView? Я знаю, что это похоже на создание NSPath из строки или чего-то в этом роде, но я просто не уверен, где искать или как это будет называться.

Заранее спасибо за любую помощь!

Ответы [ 2 ]

5 голосов
/ 26 мая 2009

Я не согласен с теми, кто обеспокоен дизайном, если это действительно код. Однако я предполагаю, что вы публикуете только обобщенную версию своего вопроса. И поскольку это важная концепция в Objective-C, мы должны поговорить об этом.

Вы можете получить доступ к свойствам объекта по имени, используя кодирование значения ключа и подпрограмму -valueWithKey:.

NSString *nameOfView = @"imageView1";
[[self valueForKey:nameOfView] setHidden:YES];

По порядку будет искать метод с именем -imageView1, ивар с именем imageView1 и, наконец, ивар с именем _imageView1. Этот метод очень интенсивно используется в какао, и его важно понимать. Это одна из многих причин, по которым мы тщательно называем вещи, и еще одна причина, по которой мы создаем средства доступа, которые управляют управлением памятью для нас. Поищите в документации «Соответствие ключ-значение» для получения дополнительной информации.

Теперь для этого конкретного случая я бы склонялся к чему-то более похожему на решение JimG, используя NSArray для представлений, поэтому я могу проходить через них и включать или выключать те, которые мне нужны, на основе их индекса. Но я могу представить множество случаев, когда это не подходит, и KVC может быть.

4 голосов
/ 26 мая 2009

Почему бы не поместить экземпляры в NSArray и индексировать в них?

NSArray *views = [NSArray arrayWithObjects: imageView1, imageView2, nil];
NSImageView *iview = [views objectAtIndex: number];

Кроме того, вы можете рассмотреть что-то вроде:

iview.hidden = ! iview.hidden;

[Редактировать: пропущенные звездочки, упс]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...