gpt4 book ai didi

ios - 无法更改父类/viewcontroller 中的 UIView 属性?

转载 作者:行者123 更新时间:2023-11-29 01:35:26 25 4
gpt4 key购买 nike

我已经使用 Swift 几个月了,但我的主要 View Controller 文件太大了。

有什么办法可以把这个文件拆分成很多子类吗?

例如:1 个文件来处理约束。1 个文件来处理用户行为。1 个文件来处理按钮...

我已经尝试这样做,但没有成功地相互连接和交流这些文件。这是示例代码:

class KeyboardViewController: UIInputViewController {
var btn = UIButton();
func DoTask() {
// call child class to do task ChildTask()
Child.ChildTask()
}
}
class Child: KeyboardViewController {
func ChildTask() {
self.btn.setTitle("abc", forState: .Normal)
}
}

在此示例中,子类不能更改 UIButton(来自父类)的属性。无论如何都要这样做?

最佳答案

您可以很好地了解在 Objc.io article by Chris Eidhof 中可以采用的一些策略来制作 View Controller 。 .

更具体地说,您可以倾向于拥有一个 View Controller 层次结构,其中您有一个父 View Controller 和一个 subview Controller 。

为了让他们能够沟通,我认为最好的做法是:

1 - 让父 Controller 拥有一个“模型”类;此类为您的 UI 属性建模(是否突出显示按钮?什么是文本字段内容?等)

2 - 当您从父 Controller 创建子 Controller 时,将共享模型传递给它。

3 - 使用 KVO (tutorial here) 确保您的 UI 对您的模型更改使用react。

在代码中,它看起来像这样(Swift 2.0):

private var myContext = 0

class MyModel : NSObject {

dynamic var buttonTitle : String = "default title"
}

class MyChildVC : UIViewController {

let model : MyModel
@IBOutlet var button : UIButton?

init(m : MyModel) {
model = m
super.init(nibName: nil, bundle: nil)
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func viewDidLoad() {
super.viewDidLoad()

self.model.addObserver(self, forKeyPath: "buttonTitle", options: .New, context: &myContext)

}

deinit {
self.model.removeObserver(self, forKeyPath: "buttonTitle", context: &myContext)
}

override func observeValueForKeyPath(keyPath: String?,
ofObject object: AnyObject?,
change: [String : AnyObject]?,
context: UnsafeMutablePointer<Void>) {

if (keyPath == "buttonTitle") {
button?.titleLabel?.text = self.model.buttonTitle
}
}

}


class MyParentVC : UIViewController {

let model = MyModel()
let vc1 : MyChildVC

init() {
self.vc1 = MyChildVC(m: model)
super.init(nibName: nil, bundle: nil)

}

func someOp() {

self.model.buttonTitle = "NewTitle"
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

一开始它可能看起来令人生畏,但一旦您习惯了它(以及 KVO 的特性),它就会像一种魅力一样发挥作用。

如果您想要 View Controller 层次结构,请不要忘记阅读一些关于 view controllers containment 的内容.

关于ios - 无法更改父类/viewcontroller 中的 UIView 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33017782/

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