我用 swift 文件创建了一对 xib 文件(对于那个 xib 文件)。 [xib_template.xib & view_template.swift] 我想通过我的 [main_VC.swift] 来控制这对 xib 文件。 xib 文件有 1 个按钮和 1 个标签。 我想在单击此按钮时更改标签的文本。
我想在我的 [main_VC] 中设置不同的模板 View 并控制它们。 但是@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")
}
最佳答案
你在这里使用了不同的初始值设定项:
- 当你说
let view_temp = view_template(uid: _uid)
时,使用了init (uid: String)
并且你的实现设置了_uid
所以它不是零。 - 当您从 XIB 加载 View 时,使用
init?(coder aDecoder: NSCoder)
并且这不会设置_uid
因此它为 nil。
要将 _uid
注入(inject)您的模板,只需在您的两个 if let loading_panels = ...
block 中输入 loading_panels._uid = _uid
。
您可能还想阅读 Swift API 设计指南中的“Follow case conventions”部分,以温习您的命名。
关于ios - 无法通过 'var' 将 'init' 传递到 '@IBAction',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43884624/