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