【发布时间】:2017-10-08 15:19:50
【问题描述】:
我用 swift 文件创建了一对 xib 文件(对于那个 xib 文件)。 [xib_template.xib & view_template.swift] 我想通过我的 [main_VC.swift] 来控制这对 xib 文件。 xib 文件有 1 个按钮和 1 个标签。 单击此按钮时,我想更改标签的文本。
我想设置不同的模板视图并在我的 [main_VC] 中控制它们。 但是@IBAction 在类内部似乎是独立的
我通过在互联网上搜索的 init 方法将值从 [main_VC] 传递到 [view_template.swift]。 我可以通过在 [main_VC] 中使用 func 来获得正确的值。 但是当点击按钮时, 该值始终为零。 IBAction 中的 var 无法从 init 中获取值。
我是 swift 新手,我已尽力而为,但仍然无法解决此问题。 如何在 IBAction 中获取初始值? 或者如何以编程方式从 [main_VC] 创建和禁用 Ibaction?
我调整了我的代码,使其更易于阅读。 可能有一些小的打字错误。
我在网上搜索并尝试了所有我能做的。 以前有人问过类似的问题,但没有答案。 希望得到帮助。 非常感谢。
[view_template.swift]
import UIKit
class View_template_empty: UIView {
var _uid: String?
@IBOutlet weak var labellabel: UILabel!
init (uid: String) {
self._uid = uid
super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
}
required init?(coder aDecoder: NSCoder) {
// fatalError("init(coder:) has not been implemented")
super.init(coder: aDecoder)
}
@IBAction func clickingPanel2(_ sender: Any) {
print(self._uid) // always nil !!!!!!
self.labellabel.text = “test”
}
fun test () {
print(self._uid) // correct value
}
}
[main_VC](只拷贝出main函数)
func allocator (_uid: String, uiView: UIView) {
switch templateType {
case “one”:
if let loading_panels = Bundle.main.loadNibNamed("xib_template", owner: uiView, options: nil)?.first as? view_template {
loading_panels.translatesAutoresizingMaskIntoConstraints = false
uiView.addSubview(loading_panels)
loading_panels.leadingAnchor.constraint(equalTo: uiView.leadingAnchor).isActive = true
loading_panels.trailingAnchor.constraint(equalTo: uiView.trailingAnchor).isActive = true
loading_panels.bottomAnchor.constraint(equalTo: uiView.bottomAnchor).isActive = true
loading_panels.topAnchor.constraint(equalTo: uiView.topAnchor).isActive = true
let view_temp = view_template(uid: _uid)
view_temp.test()
}
case “two”:
if let loading_panels = Bundle.main.loadNibNamed("xib_template_two”, owner: uiView, options: nil)?.first as? view_template_two {
loading_panels.translatesAutoresizingMaskIntoConstraints = false
uiView.addSubview(loading_panels)
loading_panels.leadingAnchor.constraint(equalTo: uiView.leadingAnchor).isActive = true
loading_panels.trailingAnchor.constraint(equalTo: uiView.trailingAnchor).isActive = true
loading_panels.bottomAnchor.constraint(equalTo: uiView.bottomAnchor).isActive = true
loading_panels.topAnchor.constraint(equalTo: uiView.topAnchor).isActive = true
}
default:
print("error")
}
【问题讨论】:
-
您是否尝试过在
test()和clickingPanel2函数中打印出self的地址?它们是同一个对象吗?您也可以添加didSet { print("uid set to \(newValue)") }来监控_uid,以防其他对象直接修改_uid。 -
我测试了两个“.self”,结果是一样的。你能解释更多的“didSet”方法吗?我不知道如何监控它。感谢您的回答
-
您可以在此处查找
didSet的示例developer.apple.com/library/content/documentation/Swift/…