Передача параметров методу, вызванному NSTimer
Как передать параметр методу, вызванному NSTimer? Мой таймер выглядит так:
[NSTimer scheduledTimerWithTimeInterval:4 target:self selector:@selector(updateBusLocation) userInfo:nil repeats:YES];
и я хочу, чтобы передать строку в метод updateBusLocation. Кроме того, где я должен определить метод updateBusLocation? В том же файле .m, что я создаю таймер?
EDIT:
На самом деле у меня все еще возникают проблемы. Я получаю сообщение об ошибке:
Завершение приложения из-за неперехваченного исключения "NSInvalidArgumentException", причина: "* - [MapKitDisplayViewController updateBusLocation]: непризнанный селектор, отправленный экземпляру 0x4623600 '
Вот мой код:
- (IBAction) showBus {
//do something
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateBusLocation) userInfo:txtFieldData repeats:YES];
[txtFieldData release];
}
- (void) updateBusLocation:(NSTimer*)theTimer
{
NSLog(@"timer method was called");
NSString *txtFieldData = [[NSString alloc] initWithString:(NSString*)[theTimer userInfo]];
if(txtFieldData == busNum.text) {
//do something else
}
}
ИЗМЕНИТЬ № 2:
Неважно, что ваш примерный код отлично работает благодаря помощи.
Ответы
Ответ 1
Вам нужно определить метод в целевом объекте. Поскольку вы задали цель как "я", тогда да, тот же объект должен реализовать этот метод. Но вы могли бы установить цель на все, что захотите.
userInfo - это указатель, который вы можете установить для любого объекта (или коллекции), который вам нравится, и который будет передан целевому селектору при срабатывании таймера.
Надеюсь, что это поможет.
EDIT:... Простой пример:
Установите таймер:
NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(handleTimer:)
userInfo:@"someString" repeats:NO];
и реализовать обработчик в том же классе (при условии, что вы устанавливаете цель на "я" ):
- (void)handleTimer:(NSTimer*)theTimer {
NSLog (@"Got the string: %@", (NSString*)[theTimer userInfo]);
}
Ответ 2
Вы можете передать свои аргументы с помощью userInfo: [NSDictionary dictionaryWithObjectsAndKeys:parameterObj1, @"keyOfParameter1"];
Простой пример:
[NSTimer scheduledTimerWithTimeInterval:3.0
target:self
selector:@selector(handleTimer:)
userInfo:@{@"parameter1": @9}
repeats:NO];
- (void)handleTimer:(NSTimer *)timer {
NSInteger parameter1 = [[[timer userInfo] objectForKey:@"parameter1"] integerValue];
}
Ответ 3
Дополнительный пример в Swift с использованием Литература словаря для передачи параметров в метод, называемый NSTimer:
override func viewDidLoad() {
super.viewDidLoad()
let dictionary: [String : AnyObject] = ["first element" : "Jordan",
"second element" : Int(23)]
NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(0.41),
target: self,
selector: "foo:",
userInfo: dictionary,
repeats: false)
}
func foo(timer: NSTimer) {
let dictionary: [String : AnyObject] = timer.userInfo! as! [String : AnyObject]
let firstElement: String = dictionary["first element"] as! String
let secondElement: Int = dictionary["second element"] as! Int
print("\(firstElement) - \(secondElement)")
}
Ответ 4
Для Swift выполните следующие действия:
Например, вы хотите отправить UILabel с помощью NSTimer
override func viewDidLoad() {
super.viewDidLoad()
var MyLabel = UILabel()
NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: Selector("callMethod:"), userInfo: MyLabel, repeats: false)
}
func callMethod(timer:NSTimer){
var MyLabel:UILabel = timer.userInfo as UILabel
}