从UIViewController向UIView传递数据无法正常工作

时间:2019-07-11 07:53:49

标签: ios swift

我正在将数据从UIViewController发送到UIView,而我面临的问题是当我设置数据以标记其不显示数据时。在设置数据之前,我先打印数据并进行打印。

class SearchDetailsView: UIView {

    @IBOutlet var contentView: UIView!
    @IBOutlet var hiraganaLbl: UILabel!

    var nameNew = String()

    required init(name: String){
        super.init(frame: CGRect.zero)
        self.nameNew = name
        self.commonInit()

    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }


    private func commonInit() {
        Bundle.main.loadNibNamed("SearchDetailsView", owner: self, options: nil)
        addSubview(contentView)
        contentView.frame = self.bounds
        contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        self.addSubview(self.contentView)
        print("name is \(self.nameNew)")
        self.hiraganaLbl.text = self.nameNew
    }


}

打印功能正在打印我从UIViewController传递但未设置为标签的数据。

3 个答案:

答案 0 :(得分:0)

由于您将xib用于SearchDetailsView,因此无需使用init来获取SearchDetailsView的新实例。

只需使用class方法loadNib(with:)来获取新的SearchDetailsView实例。

class SearchDetailsView: UIView {
    @IBOutlet var hiraganaLbl: UILabel!

    var nameNew: String? {
        didSet {
            self.hiraganaLbl.text = nameNew
        }
    }

    class func loadNib(with name: String?) -> SearchDetailsView? {
        if let view = Bundle.main.loadNibNamed("SearchDetailsView", owner: self, options: nil)?.first as? SearchDetailsView {
            view.nameNew = name
            return view
        }
        return nil
    }
}

在上面的代码中,hiraganaLbl's的{​​{1}}中设置了text didSet

在您的nameNew中,使用

获取ViewController的实例
SearchDetailsView

答案 1 :(得分:0)

代替在init函数(构造函数)中传递它,您可以编写一个新的public方法并调用它以在需要设置文本时将其设置为标签。它应该工作。喜欢

var nameNew: String;

 .... other code

public func setTextToLabel(nameNew: String) 
{
     self.nameNew = nameNew;
     self.hiraganaLbl.text = self.nameNew   
}

然后在显示此视图的ViewController中调用此方法。

答案 2 :(得分:0)

我通过在ViewController类中执行以下操作解决了该问题:

vector

并通过以下方式设置要标记的文本:

@IBOutlet var searchDetailView: SearchDetailsView!

,并删除了从init()方法发送文本的操作。