Как передать параметр этой функции?

У меня есть следующий код:

[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