2015-04-04 2 views
0

Я пытаюсь написать код, который упростит добавление новых функций во внутреннюю сборку инструмента. Существует UITableView с каждой ячейкой, являющейся кнопкой для функции, которая перейдет в другое представление.Как вызвать метод для объекта класса id?

Каждая функция находится в собственном файле класса. В настоящее время я так делаю это.

В контроллере представления, я инициализировать класс в методе, то я непосредственно перейти в его вид контроллера

- (void)resetButtonTouched { 
    [ResetClass *reset = [[ResetClass alloc] initWithNumber num]; 
    [self.navigationController pushViewController: reset animated: YES]; 
} 

Тогда для cellForRowAtIndexPath создать клетку

cell.textLabel.text = @"Reset"; 

Тогда в didSelectRowAtIndexPath I создать ответ кнопки

[_viewController resetButtonTouched]; 

И я делаю это для 10 другие функции, поэтому

[Function2 * function2 = [[Function2 alloc] initWithNumber num]; [Function3 * function3 = [[Function2 alloc] initWithNumber num];

и т.д ...

Я хотел бы упростить это, так что я только должен зарегистрировать класс в одном месте, и она будет автоматически добавлять ячейки и подключить кнопку. Для cellForRowAtIndexPath и didSelectRowAtIndexPath я могу просто заставить его посмотреть в массиве на основе indexPath.row. Но мне нужен способ хранения объектов класса в массиве и инициализация их при вызове.

Я думаю, я могу иметь все функции, которые добавляются сюда, чтобы методы класса, который будет

  • возвращение названия (для названия кнопки в cellForRowAtIndexPath)
  • имени класса (для NSClassFromString поэтому я могу определить класс объекта класса в массиве)

и нормальный метод, который будет вызываться после инициализации, чтобы сделать свой материал.

Я хочу написать что-то где, если я просто пишу эти две строки,

ResetFunction *reset; 
[self registerFunction:reset]; 

Это будет делать все, что я сделал выше (создать рабочую кнопку, которая вызывает этот объект класса)

Я m думая о наличии массива, который будет хранить все объекты класса, назовите его allFunctions и метод runFunction, который будет выполнять инициализацию и переключение. Тогда в cellForRowAtIndexPath это будет просто

cell.textLabel.text = [allFunctions[indexPath.row] getTitle]; 

и didSelectRowAtIndexPath он позвонит [_viewController runFunction:allFunctions[indexPath.row]];

Как бы мне это сделать?Я попытался создать метод с параметром id *, который принимает объект класса, с целью хранения этого в массиве allFunctions У меня возникли проблемы с созданием метода, который будет хранить все функции, потому что он дает мне «неявное преобразование указатель non-object-c на autoreleasing id запрещен ARC ", когда я пытаюсь вызвать [self registerClass: reset].

Что мне делать?

ответ

2

Объекты класса также являются объектами класса. Вместо id вы используете переменную Class для хранения ссылки на объект класса.

Class theClass = [ResetClass class]; 

Вы можете сохранить их в NSMutableArray.

[someArray addObject:theClass]; 

Вы можете позже получить класс и посылать ему сообщения:

Class theClass = someArray[index]; 
id object = [[theClass alloc] init]; 

Если вам нужно, чтобы иметь возможность запрашивать каждый объект класса для title собственности, вам необходимо реализовать на каждом класс, который вы добавляете в свой массив. Например, это метод класса реализации такого свойства класса:

+ (NSString*) title 
{ 
    return @"Blah, blah, blah"; 
} 

Вы можете получить его, используя такой код:

Class theClass = someArray[index]; 
NSString* title = [theClass title]; 
// ... code which uses the title ... 
Смежные вопросы