xcode - 如何初始化相互依赖的属性

标签 xcode swift frame cgrectmake

我想要一张图片移到底部。如果我按下按钮,图片应该向下移动 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);
    }
}

最佳答案

@MartinR 指出了这里的主要问题:

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

问题在于 Swift 默认初始化程序无法引用另一个属性的值,因为在初始化时,该属性尚不存在(因为实例本身尚不存在)。基本上,在 panzer 的默认初始化程序中,您隐式引用 self.corXself.corY - 但没有 self 因为 self 正是我们正在创建的内容。

一种解决方法是使初始化器变得惰性:

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 及其属性就存在了。

关于xcode - 如何初始化相互依赖的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55567474/

相关文章:

ios - 使用 Xcode 和手动编码了解约束

iOS/Swift : Keep "global" view pan from resetting other objects' positions, w/AutoLayout ON?

python - 使用 FFMPEG 提取帧?

ios - 需要滚动 UITableView 来更新 UITableViewCell 中的 UILabel 框架

xcode - 如何将字符串从原生 iOS 插件返回到 unity?

objective-c - 使用带有 NSString 的 XCTAssertEqual 作为错误消息参数

iphone - 如何从 UIView 访问 UIViewController 的按钮?

ios - 按键时重新启动 UIActivityIndi​​cator

ios - 如何使用 Swift 在两个类之间共享一个 UI 元素?

ios - UIButton 中的内容在动画之后移动