【问题标题】:Cannot pass 'var' by 'init' into '@IBAction'无法通过“init”将“var”传递到“@IBAction”
【发布时间】: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/…

标签: ios swift xcode swift3


【解决方案1】:

你在这里使用了不同的初始化器:

  • 当您说let view_temp = view_template(uid: _uid) 时,使用init (uid: String) 并且您的实现设置_uid 所以它不是零。
  • 当您从 XIB 加载视图时,会使用 init?(coder aDecoder: NSCoder),而这不会设置 _uid,因此它是 nil。

要将_uid 注入您的模板,只需在您的两个if let loading_panels = ... 块中输入loading_panels._uid = _uid

您可能还想阅读 Swift API 设计指南中的“Follow case conventions”部分来复习您的命名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多