Я использую addTarget: action: forControlEvents вот так:
[newsButton addTarget:self
action:@selector(switchToNewsDetails)
forControlEvents:UIControlEventTouchUpInside];
и я хотел бы передать параметры своему селектору switchToNewsDetails. Единственное, что мне удалось сделать, это передать (id) отправителя, написав:
action:@selector(switchToNewsDetails:)
Но я пытаюсь передавать переменные, например, целые числа. Записать это так не получится:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i)
forControlEvents:UIControlEventTouchUpInside];
Записать это так тоже не получится:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i:)
forControlEvents:UIControlEventTouchUpInside];
Любая помощь будет оценена :)
ios
objective-c
iphone
cocoa-touch
uicontrolevents
Пьер Эспенан
источник
источник
Ответы:
Здесь вы не передаете параметры
switchToNewsDetails:
методу. Вы просто создаете селектор, чтобы кнопка могла вызывать его, когда происходит определенное действие (в вашем случае коснитесь). Элементы управления могут использовать 3 типа селекторов для реакции на действия, все они имеют предопределенное значение своих параметров:без параметров
с 1 параметром, указывающим на элемент управления, который отправляет сообщение
С двумя параметрами, указывающими на элемент управления, отправляющий сообщение, и событие, вызвавшее сообщение:
Непонятно, что именно вы пытаетесь сделать, но, учитывая, что вы хотите назначить конкретный индекс деталей для каждой кнопки, вы можете сделать следующее:
in
switchToNewsDetails:
вы можете получить этот индекс и открыть соответствующие подробности:источник
[button.layer setValue:yourObject forKey:@"anyKey"];
а затем в методе просто проверить(objectClass *)[button.layer valueForKey:@"anyKey"];
, что это похоже на более бесплатную версию.tag
Чтобы передать пользовательские параметры вместе с нажатием кнопки, вам просто нужно SUBCLASS UIButton .
(ASR включен, поэтому в коде нет выпусков.)
Это myButton.h
Это myButton.m
Использование:
Функция приема:
Если вам нужно, чтобы я был более конкретным по какой-либо части приведенного выше кода - не стесняйтесь спрашивать об этом в комментариях.
источник
tag
свойство в представлениях Android . В них можно хранить любой предмет. И вы также можете хранить объекты по ключу, как в словаре / карте.Target-Action допускает три различных формы выбора действий:
источник
Нужно больше, чем просто (int) через .tag? Используйте KVC!
Вы можете передавать любые данные через сам объект кнопки (путем доступа к CALayers keyValue dict).
Задайте цель вот так (с помощью ":")
Добавьте свои данные к самой кнопке (ну, к
.layer
самой кнопке) следующим образом:Затем, когда кнопка нажата, вы можете проверить это так:
источник
Я принял решение, частично основываясь на приведенной выше информации. Я просто установил titlelabel.text в строку, которую хочу передать, и установил titlelabel.hidden = YES
Как это :
Таким образом, нет необходимости в наследовании или категории и нет утечки памяти.
источник
Я создавал несколько кнопок для каждого номера телефона в массиве, поэтому для каждой кнопки требовался отдельный номер телефона для вызова. Я использовал функцию setTag, поскольку создавал несколько кнопок в цикле for:
Затем в моем методе call: я использовал тот же цикл for и оператор if, чтобы выбрать правильный номер телефона:
источник
- (void)call:(UIButton *)sender { NSString *phoneNumber = _phoneNumbers[i]; NSString *callString = [NSString stringWithFormat:@"telprompt://%@", phoneNumber]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:callString]]; }
Поскольку здесь есть много способов решения, кроме функции категории.
Например (ex):
в вашем представлении Controller.m
Обработчик события:
источник
Вы можете заменить целевое действие закрытием (блок в Objective-C), добавив вспомогательную оболочку закрытия (ClosureSleeve) и добавив ее в качестве связанного объекта в элемент управления, чтобы он сохранялся. Таким образом вы можете передавать любые параметры.
Swift 3
Использование:
источник
self.switchToNewsDetails(parameter: i)
) стреляет 2 раза, зачем мнеbutton.addAction()
. Добавьте точку остановаbutton.addAction
в первую строку внутри замыкания и попробуйте отладить ее самостоятельно.Есть еще один способ, которым вы можете получить indexPath ячейки, в которой была нажата ваша кнопка:
используя обычный селектор действий, например:
а затем в yourFunction:
поскольку вы получили indexPath, это стало намного проще.
источник
См. Мой комментарий выше, и я считаю, что вам нужно использовать NSInvocation, когда есть более одного параметра
больше информации о NSInvocation здесь
http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html
источник
Это устранило мою проблему, но она вылетела, если я не изменил
в
источник
Я создал подкласс UIButton в CustomButton и добавил свойство, в котором я храню свои данные. Поэтому я вызываю метод: (CustomButton *) sender, и в этом методе я читаю только свои данные sender.myproperty.
Пример CustomButton:
Действие метода:
Назначить действие
источник
Если вы просто хотите изменить текст для leftBarButtonItem, отображаемого контроллером навигации вместе с новым представлением, вы можете изменить заголовок текущего представления непосредственно перед вызовом pushViewController на требуемый текст и восстановить его в обратном вызове viewHasDisappered для будущих отображений текущий вид.
Этот подход сохраняет функциональность (popViewController) и внешний вид показанной стрелки без изменений.
У нас это работает, по крайней мере, с iOS 12, созданной с помощью Xcode 10.1 ...
источник