【问题标题】:How to load nib in a ViewController on a placeholderView如何在 placeholderView 上的 ViewController 中加载 nib
【发布时间】:2019-03-18 04:55:34
【问题描述】:

我有一个视图控制器,它有一个placeholder 视图,我还有一个自定义的nib,我想将它添加到那个 placeHolderView。我正在努力弄清楚如何在 viewController 中注册笔尖,以便当我推送到此视图控制器时,占位符视图被我的笔尖替换。

这是我尝试过的:

CountryViewController

import UIKit

class CountryViewController: UIViewController {

    @IBOutlet weak var mainView: UIView!
    @IBOutlet weak var flagImage: UIImageView!
    @IBOutlet weak var countryInfoViewPlaceHolder: UIView!

    private let countryDetails: CountryData

    override func viewDidLoad() {
        super.viewDidLoad()
        setUpNavBar(countryName: countryDetails.name)
        addSubView()
    }

    init(countryDetails: CountryData) {
        self.countryDetails = countryDetails
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        return nil
    }


    func setUpNavBar(countryName: String) {
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
        self.title = countryName
        self.navigationController?.navigationBar.tintColor = UIColor.countryThemeGrey()
    }

    func addSubView() {
        guard let nibView = Bundle.main.loadNibNamed("CountryDetailsView", owner: self, options: nil)?.first as? CountryDetailsView else {
            return
        }
        countryInfoViewPlaceHolder.addSubview(nibView)
    }
}

CountryDetailsView

class CountryDetailsView: UIView {

    @IBOutlet weak var capitalLabel: UILabel!
    @IBOutlet weak var regionLabel: UILabel!
    @IBOutlet weak var subRegionLabel: UILabel!

    convenience init() {
        self.init(frame: .zero)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        return nil
    }

    private func commonInit() {
//        let nib = UINib(nibName: String(describing: type(of: self)), bundle: nil)
//        contentView = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
//        addSubviewPinnedToEdges(contentView)
        Bundle(for: CountryDetailsView.self).loadNibNamed("CountryDetailsView", owner: self, options: nil)
    }

    func setViewWithData(country: CountryData) {
        capitalLabel.text = country.capital
        regionLabel.text = country.region
        subRegionLabel.text = country.subRegion
    }

}

【问题讨论】:

  • 问题在这里 -> required init?(coder aDecoder: NSCoder) { return nil }
  • 我应该返回什么
  • 好吧,我想我添加了:super.init(coder: aDecoder) 并且它起作用了

标签: swift subview nib


【解决方案1】:

您可以添加静态方法。如下所示

class CountryDetailsView: UIView {

@IBOutlet weak var capitalLabel: UILabel!
@IBOutlet weak var regionLabel: UILabel!
@IBOutlet weak var subRegionLabel: UILabel!

static func initView() -> CountryDetailsView {
    return Bundle(for: CountryDetailsView.self).loadNibNamed(String(describing: CountryDetailsView.self), owner: self, options: nil)!.first as! CountryDetailsView
}

func setViewWithData(country: CountryData) {
    capitalLabel.text = country.capital
    regionLabel.text = country.region
    subRegionLabel.text = country.subRegion
}
}

用途:

func addSubView() {
    let nibView = CountryDetailsView.initView()
    countryInfoViewPlaceHolder.addSubview(nibView)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2019-12-31
    • 2011-02-05
    • 2015-05-31
    • 1970-01-01
    相关资源
    最近更新 更多