NSString к переменной экземпляра класса - PullRequest
4 голосов
/ 27 ноября 2011

Я ищу способ преобразования NSString в переменную экземпляра класса. Для примера кода ниже, скажите, что фильтр "colorFilter". Я хочу, чтобы имя_файла класса было здесь заменено на colorFilter.

- (void)filterSelected:(NSString *)filter
{
    self.filternameclassinstancegohere = ….;
}

Ответы [ 4 ]

5 голосов
/ 29 ноября 2011

Хотя для этого вопроса были предложены хорошие решения, я обнаружил, что мне нужен метод NSClassFromString.Вот окончательная реализация:

- (void)filterSelected:(NSString *)filter
{
    //self.filternameclassinstancegohere = ….;
    self.myViewController = [[NSClassFromString(filter) alloc] initWithNibName:filter bundle:nil];

}
4 голосов
/ 27 ноября 2011

Попробуйте использовать одну переменную экземпляра NSMutableDictionary со строковыми ключами, а не 40 переменных экземпляра.

2 голосов
/ 27 ноября 2011

Вы можете создать произвольный селектор, используя NSSelectorFromString():

SEL methodName = NSSelectorFromString(filter);
[self performSelector:methodName];

Это вызовет метод colorFilter в вашем примере выше.

Было бы целесообразно проверить также с respondsToSelector перед звонком.

1 голос
/ 27 ноября 2011

Если значение фильтра может быть только небольшим постоянным числом, просто используйте перечисление и оператор switch:

enum Filter
{
  ColorFilter,
  FooFilter,
  BarFilter
};

- (void)filterSelected:(Filter)filter
{
  switch(filter)
  {
  case ColorFilter:
    self.colorFilter = ...;
    break;
  case FooFilter:
    self.fooFilter = ...;
    break;
  case BarFilter:
    self.barFilter = ...;
    break;
  }
}

Если набор значений фильтра велик и может часто меняться, вы также можете использовать Кодирование значения ключа . Это сложнее, но более гибко.

...