Как добавить UITableView в UIView? - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть 2 xib-файла: пользовательский UIView и пользовательская ячейка xib.У меня также есть класс Custom Cell, который содержит только UILabel.Все имена верны.

Делегаты UITableView подключены к представлению.

Мне нужно добавить UITableView в UIView.Из учебников, которые я прочитал, это как добавить.Но по какой-то причине это не работает, я получаю 2 типа ошибок с этим кодом, которые говорят, что мне нужно зарегистрировать nib ячейки или что он находит nil при развертывании необязательного.Что я делаю неправильно?Пожалуйста, помогите!

private let myArray: NSArray = ["First","Second","Third"]

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("Num: \(indexPath.row)")
    print("Value: \(myArray[indexPath.row])")
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return myArray.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath)
    cell.textLabel!.text = "\(myArray[indexPath.row])"
    return cell
}


@IBOutlet var contentView: UIView!

@IBOutlet weak var tableView: UITableView!

@IBOutlet weak var HelperLabel: UILabel!

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

    commonInit()
}

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

private func commonInit(){
    let nib = UINib(nibName: "MyCell", bundle: nil)

    tableView.register(nib, forCellReuseIdentifier: "MyCell")

    tableView.dataSource = self
    tableView.delegate = self
    self.addSubview(tableView)

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Вот полный код вашей проблемы

Код для класса CustomCell: взять пользовательскую Xib для ячейки

import UIKit
class CustomCell: UITableViewCell {

    @IBOutlet weak var myLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

Код для класса CustomView: принять пользовательскую Xib для просмотра

import UIKit
class CustomView: UIView {

    var tableData: [String] = ["First","Second","Third"]    
    @IBOutlet weak var myTableView: UITableView!

    class func instanceFromNib() -> UIView {
        return UINib(nibName: "CustomView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView
    }

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

    static func nibInstance() -> CustomView? {
        let customView = UINib(nibName: "CustomView", bundle: nil).instantiate(withOwner: nil, options: nil).first as? CustomView
        return customView
    }

    func baseInit() {
        self.myTableView.delegate = self
        self.myTableView.dataSource = self
        self.myTableView.register(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCell")
    }
}

    extension CustomView : UITableViewDelegate, UITableViewDataSource  {

        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return tableData.count
        }

        func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
            return 50
        }

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
            cell.myLabel.text = tableData[indexPath.row]
            return cell
        }

    }

Примечание. Установите для пользовательского класса Xib значение UIView Class, в зависимости от того, что вы хотите использовать в моем случае: «CustomView»

Код контроллера:

class CustomViewController: UIViewController {

    var customView : CustomView?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        DispatchQueue.main.asyncAfter(deadline: DispatchTime(uptimeNanoseconds: UInt64(0.5))) {
            self.loadViewCustom()
        }
    }

    func loadViewCustom() {
        self.customView = CustomView.nibInstance()
        self.customView?.frame = self.view.frame
        self.customView?.baseInit()
        self.view.addSubview(self.customView!)
        self.customView?.myTableView.reloadData()
    }
}
0 голосов
/ 07 декабря 2018

tableView - это IBOutlet в xib-файле?зачем вам addSubView?

...