Могу ли я передать аргумент массива с @selector для кнопки UIB? - PullRequest
2 голосов
/ 30 марта 2012

У меня есть UIButton, к которому я хочу добавить целевое действие, которое сохраняется в NSArray.

Я хочу что-то вродепытается, но его сообщения об ошибках показывают, как, Expected Identifier и Expected ]

Возможно ли это?Есть ли способы сделать это?

Ответы [ 4 ]

8 голосов
/ 30 марта 2012

Если myArray - это массив NSStrings, который вы хотите использовать в качестве селекторов, тогда вы можете использовать NSSelectorFromString:

[myButton addTarget:self action:NSSelectorFromString([myArray objectAtIndex:0]) forControlEvents:UIControlEventTouchUpInside];

Или, если вы хотите сохранить селекторы в NSArray, вы должны обернуть их в NSValue, потому что SEL не является объектом Objective-C:

NSValue* selCommandA = [NSValue valueWithPointer:@selector(handleCommandA:)];
NSValue* selCommandB = [NSValue valueWithPointer:@selector(handleCommandB:)];

NSArray *handlers = [NSArray arrayWithObjects:selCommandA, selCommandB, nil ];

SEL mySelector = [[handlers objectAtIndex:0] pointerValue];
[myButton addTarget:self action:mySelector forControlEvents:UIControlEventTouchUpInside];
4 голосов
/ 30 марта 2012

Вы можете сохранить имена селекторов в виде строки, а затем создать селектор из этих имен.Пример:

myArray = [NSArray arrayWithObjects:@"method1", @"method2", nil];
[myButton addTarget:self action:NSSelectorFromString([myArray objectAtIndex:0]) forControlEvents:UIControlEventTouchUpInside];
1 голос
/ 30 марта 2012

Вместо этого вы можете попробовать поместить селектор в массив.

A SEL является структурой, поэтому вам нужно преобразовать ее в NSValue, чтобы сохранить ее в массиве

[myArray addObject:[NSValue valueWithBytes:&@selector(myAction) withObjCType:@encode(Selector)]];

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

SEL selector;
[[myArray objectAtIndex:0] getValue:&selector];
[myButton addTarget:self action:selector forControlEvents:UIControlEventTouchUpInside];
0 голосов
/ 30 марта 2012

Селектор - это имя метода (например, "doSomething:") внутри объекта или класса и не может быть самим объектом.

Если вы хотите передать массив, попросите этот метод получитьmyArray как переменная экземпляра, определенная в файле интерфейса .h или @property.

...