gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:46:58 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com