Подтвердить что ты не робот

Передача параметров методу, вызванному 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: Неважно, что ваш примерный код отлично работает благодаря помощи.

4b9b3361

Ответ 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

}