#selector Parameter übergeben

TheFlint

Erdapfel
Registriert
18.09.16
Beiträge
4
Hi Leute, ich habe ein Problem mit #selectors. Ich habe eine Methode: "func move(imgView: UIImageView)". Nun weiß ich, dass ich einen Selektor für diese Methode so erstelle: "#selector(ViewController.move(imgView:))". Jedoch kann ich keinen Wert für den Parameter imgView übergeben. Ich möchte aber eine Image View übergeben die ich zuvor programmatisch erstellt habe. Wie kann ich das machen?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Den ImageView übergeben muss derjenige, der die Methode letztendlich aufruft.
 

TheFlint

Erdapfel
Registriert
18.09.16
Beiträge
4
@MacApple Genau, und das ist der Selektor, der wiederum an einen Timer gebunden ist. Es ist notwendig, dass der Selektor alle 0,1 sekunden (Timer) die Methode aufruft und eine Variable namens iView übergibt, die in der selben Methode wie der selektor erstellt wurde.
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Ein Selector ruft nichts auf. Du übergibst den Selector dem Timer, damit der weiß, welche Methode er aufrufen soll. Ein Timer ruft aber nur eine Methode auf, die einen NSTimer als Parameter akzeptiert. Siehe Dokumentation.
Kurz: das, was du dir da vorstellst, geht nicht.
 

TheFlint

Erdapfel
Registriert
18.09.16
Beiträge
4
Ein Selector ruft nichts auf. Du übergibst den Selector dem Timer, damit der weiß, welche Methode er aufrufen soll. Ein Timer ruft aber nur eine Methode auf, die einen NSTimer als Parameter akzeptiert. Siehe Dokumentation.
Kurz: das, was du dir da vorstellst, geht nicht.

@MacApple
Und wie kann ich in der Methode auf die ImageView des Timers zugreifen?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Ein Timer hat keinen ImageView. Du kannst dir ein Dictionary anlegen, mit dem Timer als Key und dem View als Value.
Beispiel:
Code:
class Foo : NSObject {

    var views = [Timer: UIImageView]()

    func fired(timer: Timer) {
        if let view = views[timer] {
            // Do something with the view
        }
    }

    func createTimer() {
        let view = UIImageView()
        let timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(Foo.fired(timer:)), userInfo: nil, repeats: true)
        views[timer] = view
    }
}
Aber, wie dir in einem anderen Forum bereits mitgeteilt wurde, sieht das ja nach View Animation aus. Dafür bietet iOS mit Core Animation bessere Möglichkeiten.
 

TheFlint

Erdapfel
Registriert
18.09.16
Beiträge
4
@MacApple vielen Dank. Wie würde eine Animation funktionieren, bei der sich eine ImageView konstant nach rechts bewegt, welche automatisch stoppt, wenn die ImageView eine gewisse X-Positon erreicht und dann die ImageView löscht?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Kleiner Beispiel-Playground:
Code:
//: Playground - noun: a place where people can play

import UIKit
import PlaygroundSupport

let containerView = UIView(frame: CGRect(x: 0, y: 0, width: 400, height: 400))
containerView.backgroundColor = #colorLiteral(red: 0.9568627477, green: 0.6588235497, blue: 0.5450980663, alpha: 1)

PlaygroundPage.current.liveView = containerView

let movedView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 10))
movedView.backgroundColor = #colorLiteral(red: 0.5725490451, green: 0, blue: 0.2313725501, alpha: 1)

containerView.addSubview(movedView)

UIView.animate(withDuration: 2.0, animations: { 
    movedView.frame = CGRect(x: 100, y: 100, width: 200, height: 200)
    }) { (flag) in
        movedView.removeFromSuperview()
}