web-dev-qa-db-ja.com

NSTimerによって呼び出されたメソッドにパラメーターを渡す

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:サンプルコードが問題なく機能することを気にしないでください。

61
bubster

ターゲットでメソッドを定義する必要があります。ターゲットを「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]);

}
99
Firoze Lafeer

引数を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];
}
23
Oleh Kudinov

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()を呼び出して、継続的に実行されないように注意してください。

4
George Leonidas

Swiftの場合、このようにします。

たとえば、NSTimerILabelを送信したい場合

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

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

質問に対する直接的な答えではありませんが、検索中にこれに遭遇し、別の何かが必要だったので、誰かを助けるかもしれません。ヘルパークラスで関数を呼び出したいと思いました。それはUIViewControllerで渡す必要があり、userinfoで渡すのではなく、他の場所で手動で関数を呼び出すことができず、タイマーを作成する別の関数を作成しましたそこから私が興味を持っていた関数を呼び出して呼び出します。回避策。

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

func timerFired() {

myFunction(controller: self)

}
0
Sam Bing