it-swarm.com.de

Übergabe von Parametern an die von einem NSTimer aufgerufene Methode

Wie kann ich einen Parameter an die von einem NSTimer aufgerufene Methode übergeben? Mein Timer sieht so aus:

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

und ich möchte eine Zeichenfolge an die Methode updateBusLocation übergeben können. Wo soll auch die Methode updateBusLocation definiert werden? In derselben .m-Datei, in der ich den Timer erstellt habe?

BEARBEITEN:

Eigentlich habe ich immer noch Probleme. Ich erhalte die Fehlermeldung:

App wegen nicht abgerufener Ausnahme 'NSInvalidArgumentException' beendet, Grund: '* - [MapKitDisplayViewController updateBusLocation]: nicht erkannter Selektor an Instanz 0x4623600 gesendet

Hier ist mein Code:

- (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: Egal, ob Ihr Beispielcode gut funktioniert, danke für die Hilfe.

60
bubster

Sie müssen die Methode im Ziel definieren. Da Sie das Ziel als "selbst" festlegen, muss dieses Objekt auch die Methode implementieren. Aber Sie hätten das Ziel auf alles andere setzen können, als Sie wollten.

userInfo ist ein Zeiger, den Sie auf ein beliebiges Objekt (oder eine beliebige Sammlung) setzen können, das an den Zielselektor übergeben wird, wenn der Timer ausgelöst wird.

Hoffentlich hilft das.

EDIT: ... Einfaches Beispiel:

Timer einstellen:

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

und implementieren Sie den Handler in derselben Klasse (vorausgesetzt, Sie setzen das Ziel auf 'self'):

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

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

}
97
Firoze Lafeer

Sie können Ihre Argumente mit userInfo übergeben: [NSDictionary dictionaryWithObjectsAndKeys:parameterObj1, @"keyOfParameter1"];

Ein einfaches Beispiel:

[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];
}
23
Oleh Kudinov

Für Swift mach das so,

Zum Beispiel möchten Sie UILabel mit NSTimer senden

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

}
3
Zaid Pathan

Zusätzliches Beispiel in Swift using Dictionary wörtlich für Parameter übergeben an die von NSTimer aufgerufene Methode: 

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)")
}
2
King-Wizard

Für Swift 4.0:

Sie können eine Funktion mit beliebigen Parametern verwenden und den Block "scheduleTimer" verwenden, um den Code auszuführen, den Sie wiederholen müssen.

func someFunction(param1: Int, param2: String) {

    let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
        print(param1)
        print(param2)
    }
}

Achten Sie darauf, timer.invalidate () aufzurufen, wenn Sie den Vorgang abgeschlossen haben, um zu verhindern, dass er kontinuierlich läuft.

0
George Leonidas

Keine direkte Antwort auf die Frage, aber da ich bei der Suche darauf gestoßen bin und etwas anderes brauchte, kann es jemandem helfen. Ich wollte eine Funktion in einer Hilfsklasse aufrufen, die ich in UIViewController übergeben musste, anstatt sie mit userinfo zu übergeben, wodurch ich die Funktion nicht manuell aufrufen könnte Funktion, an der ich von dort interessiert war. Eine Problemumgehung, die geholfen hat.

Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(self.timerFired), userInfo: nil, repeats:true);

func timerFired() {

myFunction(controller: self)

}
0
Sam Bing