NSTimerによって呼び出されるメソッドにパラメーターを渡すにはどうすればよいですか?私のタイマーは次のようになります。
[NSTimer scheduledTimerWithTimeInterval:4 target:self selector:@selector(updateBusLocation) userInfo:nil repeats:YES];
そして、メソッドupdateBusLocationに文字列を渡すことができるようにしたいと思います。また、メソッドupdateBusLocationを定義する場所はどこですか?タイマーを作成するのと同じ.mファイルで?
編集:
実際、私はまだ問題を抱えています。エラーメッセージが表示されます。
キャッチされない例外 '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:サンプルコードが問題なく機能することを気にしないでください。
ターゲットでメソッドを定義する必要があります。ターゲットを「self」に設定しているため、はい、同じオブジェクトがメソッドを実装する必要があります。ただし、ターゲットを他の任意のものに設定することもできます。
userInfoは、任意のオブジェクト(またはコレクション)に設定できるポインターであり、タイマーの起動時にターゲットセレクターに渡されます。
お役に立てば幸いです。
編集:...簡単な例:
タイマーを設定します。
NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(handleTimer:)
userInfo:@"someString" repeats:NO];
そして、同じクラスにハンドラーを実装します(ターゲットを「self」に設定していると仮定):
- (void)handleTimer:(NSTimer*)theTimer {
NSLog (@"Got the string: %@", (NSString*)[theTimer userInfo]);
}
引数を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];
}
Swift 4.0:の場合
必要なパラメーターを持つ関数を作成し、「scheduledTimer」ブロックを使用して、繰り返す必要があるコードを実行できます。
func someFunction(param1: Int, param2: String) {
let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
print(param1)
print(param2)
}
}
終了時にtimer.invalidate()を呼び出して、継続的に実行されないように注意してください。
Swiftの場合、このようにします。
たとえば、NSTimerでILabelを送信したい場合
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
}
Swift using Dictionary literal for passing parametersで呼び出されるメソッドへの追加の例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)")
}
質問に対する直接的な答えではありませんが、検索中にこれに遭遇し、別の何かが必要だったので、誰かを助けるかもしれません。ヘルパークラスで関数を呼び出したいと思いました。それはUIViewController
で渡す必要があり、userinfoで渡すのではなく、他の場所で手動で関数を呼び出すことができず、タイマーを作成する別の関数を作成しましたそこから私が興味を持っていた関数を呼び出して呼び出します。回避策。
Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(self.timerFired), userInfo: nil, repeats:true);
func timerFired() {
myFunction(controller: self)
}