#swift #subview #nib
#swift #вложенный просмотр #перо
Вопрос:
У меня есть контроллер представления, который имеет 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
}
}
Комментарии:
1. проблема здесь ->
required init?(coder aDecoder: NSCoder) { return nil }
2. что я должен вернуть
3. Хорошо, я понял это, я добавил: super.init (кодировщик: aDecoder), и это сработало
Ответ №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)
}