不能通过'init'将'var'传递给'@IBAction'

时间:2017-05-10 06:02:44

标签: ios swift xcode swift3

我使用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中获取init值? 或者我如何以编程方式创建&从[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](仅复制主要功能)

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")
}

1 个答案:

答案 0 :(得分:1)

您在这里使用不同的初始值设定项:

  • 当您说let view_temp = view_template(uid: _uid)时,会使用init (uid: String)并且您的实施设置为_uid,因此它不是零。
  • 从XIB加载视图时,使用了init?(coder aDecoder: NSCoder),但未设置_uid,因此它为零。

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

您可能还想阅读Swift API设计指南中的“Follow case conventions”部分,以了解您的命名。