Как передать параметр этой функции?
У меня есть следующий код:
[replyAllBtn addTarget:self.target action:@selector(ReplyAll:) forControlEvents:UIControlEventTouchUpInside];
- (void)replyAll:(NSInteger)tid {
// some code
}
Как я могу отправить параметр функции ReplyAll
?
Ответы
Ответ 1
Метод replyAll должен принимать (id) отправителя. Если UIButton запустил событие, то тот же UIButton будет передан в качестве отправителя. У UIButton есть свойство "tag", к которому вы можете присоединить свои собственные данные (например, winforms.net).
Итак, вы подключили свое событие с помощью:
[replyAllBtn addTarget:self.target action:@selector(ReplyAll:) forControlEvents:UIControlEventTouchUpInside];
replyAllBtn.tag=15;
тогда обработайте его с помощью:
(void) ReplyAll:(id)sender{
NSInteger *tid = ((UIControl*)sender).tag;
//...
Ответ 2
Функция селектора обычно определяется как таковая:
- (void) ReplyAll:(id)sender;
Таким образом, единственный параметр, который когда-либо будет принимать действие, - это фактический элемент управления, который его вызвал.
Вы можете просто добавить свойство к своему элементу управления, которое можно прочитать в replyAll
Ответ 3
Если вы хотите отправить значение int, установите тег кнопки = значение int, которое вы хотите передать. Затем вы можете получить доступ к значению тега кнопки, чтобы получить нужную вам сумму.
NSInteger не является указателем. Попробуйте это
NSInteger tid = sender.tag;
Ответ 4
Теперь он работает: D.
{
NSInteger tid = [sender tag];
}
Ответ 5
Модель MVC, используемая в Cocoa, работает по-разному. В принципе, идея состоит в том, что элемент управления (= вид), такой как кнопка, позволяет только функции знать, что он был нажат, не зная, что это значит. Затем функция должна знать всю динамику и зависимости. В вашем случае это функция, которая должна найти параметр. Для этого вы будете "связывать" другие объекты с функцией (= контроллер).
Я предлагаю вам сначала прочитать несколько учебных пособий Cocoa, если вы хотите продолжить программирование iPhone.
Ответ 6
Есть несколько хороших способов сделать это. Двумя наиболее часто выполняемыми должно быть то, что контроллер (кто получает действие) знает о возможных отправителях или сам отправитель имеет метод, который вы используете для определения правильного поведения.
Первый (мой предпочтительный способ, но легко спорить об обратном) будет реализован следующим образом:
@interface Controller : NSObject {
UIButton *_replyToSender;
UIButton *_replyToAll;
}
- (void)buttonClicked:(id)sender;
@end
@implementation Controller
- (void)buttonClicked:(id)sender {
if (sender == _replyToSender) {
// reply to sender...
} else if (sender == _replyToAll) {
// reply to all...
}
}
@end
Второй способ будет реализован таким образом, как:
typedef enum {
ReplyButtonTypeSender = 1,
ReplyButtonTypeAll,
} ReplyButtonType;
@interface Controller : NSObject {
}
- (void)buttonClicked:(id)sender;
@end
@interface MyButton : UIButton {
}
- (ReplyButtonType)typeOfReply;
@end
@implementation Controller
- (void)buttonClicked:(id)sender {
// You aren't actually assured that sender is a MyButton, so the safest thing
// to do here is to check that it is one.
if ([sender isKindOfClass:[MyButton class]]) {
switch ([sender typeOfReply]) {
case ReplyButtonTypeSender:
// reply to sender...
break;
case ReplyButtonTypeAll:
// reply to all...
break;
}
}
}
@end