ios - 无法通过 'var' 将 'init' 传递到 '@IBAction'

标签 ios swift xcode swift3

我用 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/

相关文章:

ios - 应用程序卡在 LaunchScreen 上且没有错误消息

iphone - 当手绕传感器移动时,接近传感器打开

swift - 如何在 Swift 2.0 中创建 JSON 对象?

ios - UIImageView 未在 3,5 屏幕上完全显示

ios - 我如何在同一个项目中拥有 iOS 应用程序和 OS X 应用程序?

ios - UICollectionViewCell 中的 addSubview 不准确

jquery - iOS Safari 滚动到顶部在某些页面上不起作用。为什么?

ios - 进入后台并返回前台后无法继续从 AVAssetReaderOutput 读取

ios - 具有默认 nil 值的 UIDatePicker - iOS

ios - 我如何使用 swiftlint 强制每个 swift 文件必须包含指定的 header 值?