2010-10-25 12 views
55

Jak przekazać parametr do metody wywoływanej przez NSTimer? Mój timer wygląda następująco:Przekazywanie parametrów do metody wywoływanej przez NSTimer

[NSTimer scheduledTimerWithTimeInterval:4 target:self selector:@selector(updateBusLocation) userInfo:nil repeats:YES]; 

i chcę mieć możliwość przekazania ciągu znaków do metody updateBusLocation. Ponadto, gdzie mam zdefiniować metodę updateBusLocation? W tym samym pliku .m, który tworzę timer?

EDIT:

Właściwie jestem nadal występują problemy. Otrzymuję komunikat o błędzie:

kończące aplikację spowodowane nieprzechwyconego wyjątku 'NSInvalidArgumentException', powód: '* - [MapKitDisplayViewController updateBusLocation]: selektor nierozpoznany wysyłane do instancji 0x4623600'

Oto mój kod:

- (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 
    } 
    } 

EDYCJA # 2: Nie bój się przykładowy kod działa dobrze dzięki za pomoc.

+0

stałe wątpliwości, że im na pewno mnóstwo ludzi zastanawiało się w jednym punkcie lub innego. Dzięki! –

Odpowiedz

95

Musisz zdefiniować metodę w celu. Ponieważ ustawiłeś cel jako "własny", to tak, ten sam obiekt musi wdrożyć tę metodę. Ale mógłbyś ustawić cel na wszystko, co chciałeś.

userInfo jest wskaźnikiem, który możesz ustawić na dowolny obiekt (lub kolekcję), który ci się podoba i który zostanie przekazany do selektora celu, gdy timer się uruchomi.

Nadzieję, że pomaga.

EDYCJA: ...Prosty przykład:

Ustaw Timer:

NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval:2.0 
           target:self 
           selector:@selector(handleTimer:) 
           userInfo:@"someString" repeats:NO]; 

i wdrożenie obsługi w tej samej klasie (przy założeniu, że ustawienie cel 'ja'):

- (void)handleTimer:(NSTimer*)theTimer { 

    NSLog (@"Got the string: %@", (NSString*)[theTimer userInfo]); 

} 
+0

Ciągle jestem zagubiony, czy mógłbyś podać mi przykład licznika, który wywołuje metodę i przekazuje parametr tej metodzie? – bubster

+0

Jasne, zredagowałem swoją odpowiedź na prostym przykładzie –

22

Ty może przekazywać argumenty za pomocą userInfo: [NSDictionary dictionaryWithObjectsAndKeys:parameterObj1, @"keyOfParameter1"];

Prosty przykład:

[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

Dla Swift zrobić tak,

Na przykład pan chce wysłać UILabel z 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

dodatkowy przykład w Swift użyciu słownik dosłowne dla przekazanie parametrów do metody wywoływanej przez 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)") 
} 
Powiązane problemy