#selector Parameter übergeben

Dieses Thema im Forum "iOS-Developer" wurde erstellt von TheFlint, 18.09.16.

  1. TheFlint

    TheFlint Erdapfel

    Dabei seit:
    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?
     
  2. MacApple

    MacApple Schmalzprinz

    Dabei seit:
    05.01.04
    Beiträge:
    3.563
    Den ImageView übergeben muss derjenige, der die Methode letztendlich aufruft.
     
  3. TheFlint

    TheFlint Erdapfel

    Dabei seit:
    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.
     
  4. MacApple

    MacApple Schmalzprinz

    Dabei seit:
    05.01.04
    Beiträge:
    3.563
    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.
     
  5. TheFlint

    TheFlint Erdapfel

    Dabei seit:
    18.09.16
    Beiträge:
    4
    @MacApple
    Und wie kann ich in der Methode auf die ImageView des Timers zugreifen?
     
  6. MacApple

    MacApple Schmalzprinz

    Dabei seit:
    05.01.04
    Beiträge:
    3.563
    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.
     
  7. TheFlint

    TheFlint Erdapfel

    Dabei seit:
    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?
     
  8. MacApple

    MacApple Schmalzprinz

    Dabei seit:
    05.01.04
    Beiträge:
    3.563
    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()
    }