78

画像を一番下に移動したい。ボタンを押すと、写真が1つ下に移動するはずです。

写真とボタンを追加しました:

var corX = 0
var corY = 0

var runter: UIButton = UIButton.buttonWithType(UIButtonType.System) as UIButton

var image = UIImage(named: "panzerBlau.jpg");
var panzer = UIImageView(frame: CGRectMake(corX, corY, 30, 40));  //

override func viewDidLoad() {
    super.viewDidLoad()

    panzer.image = image;    //
    self.view.addSubview(panzer);    //

    runter.frame = CGRectMake(100, 30, 10 , 10)
    runter.backgroundColor = UIColor.redColor()
    view.addSubview(runter)
    runter.addTarget(self, action: "fahren", forControlEvents:UIControlEvents.TouchUpInside)
}

少なくとも、関数「fahren」で画像を 1 つ下に移動するように言いました。

func fahren(){
    corY += 1
    panzer.frame = CGRectMake(corX, corY, 30, 40) //
    self.view.addSubview(panzer);
}

したがって、私の問題は次のとおりです。これらのcorXおよびcorYでいくつかのエラーが発生します。それらがなくても完全に機能しますが、使い捨てのボタンのようではありません. エラーは次のとおりです。ViewController.Type には、corX という名前のメンバーがありません。また、ViewController.Type には、panzer という名前のメンバーがありません。

PS: Xcode Beta5 を使用しています

他に何もない完全なコードは次のとおりです。

import UIKit

class ViewController: UIViewController {

    var corX = 0
    var corY = 0
    var runter: UIButton = UIButton.buttonWithType(UIButtonType.System) as UIButton
    var image = UIImage(named: "panzerBlau.jpg");
    var panzer = UIImageView(frame: CGRectMake(corX, corY, 30, 40));

    override func viewDidLoad() {
        super.viewDidLoad()
            panzer.image = image;
            self.view.addSubview(panzer);

        runter.frame = CGRectMake(100, 30, 10 , 10)
        runter.backgroundColor = UIColor.redColor()
        view.addSubview(runter)
        runter.addTarget(self, action: "fahren", forControlEvents:UIControlEvents.TouchUpInside)
    }

    func fahren(){
        corY += 100
        panzer.frame = CGRectMake(corX, corY, 30, 40)
        self.view.addSubview(panzer);
    }
}
4

4 に答える 4

66

@MartinR は、ここで大きな問題を指摘しています。

var corX = 0
var corY = 0
var panzer = UIImageView(frame: CGRectMake(corX, corY, 30, 40))

問題は、Swift のデフォルト イニシャライザが別のプロパティの値を参照できないことです。これは、初期化の時点ではプロパティがまだ存在しないためです (インスタンス自体がまだ存在しないため)。基本的に、 inpanzerのデフォルトのイニシャライザでは、暗黙的に and を参照していますがself.corX、はまさに作成中のものであるためself.corY、ありません。selfself

1 つの回避策は、初期化子を遅延させることです。

class ViewController: UIViewController {
    var corX : CGFloat = 0
    var corY : CGFloat = 0
    lazy var panzer : UIImageView = UIImageView(frame: CGRectMake(self.corX, self.corY, 30, 40))
    // ...
}

panzer後で実際のコードによって最初に参照されるまで初期化されないため、これは合法です。その時までにself、そのプロパティが存在します。

于 2014-09-15T20:55:26.590 に答える