2010-10-25 3 views
55

Как передать параметр методу, вызванному 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 
    } 
    } 

EDIT # 2: Не обращайте внимания на ваш пример кода, который отлично работает за помощь.

+0

Твердая вопрос, который я уверен, тонна людей задавались в тот или иной момент. Благодаря! –

ответ

95

Вам необходимо определить метод в цели. Поскольку вы задали цель как «я», тогда да, тот же объект должен реализовать этот метод. Но вы могли бы настроить цель на все, что захотите.

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]); 

} 
+0

Я все еще потерял, не могли бы вы дать мне пример таймера, который вызывает метод и передает параметр этому методу? – bubster

+0

Конечно, я отредактировал свой ответ простым примером –

22

Вы могут передавать ваши аргументы с помощью пользовательской информации: [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]; 
} 
1

Для 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 

} 
2

Дополнительного примером в 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)") 
} 
Смежные вопросы