Как использовать пользовательский вид с в Swift? - PullRequest
0 голосов
/ 14 января 2019

Я хочу добавить пользовательское представление в TableViewHeader. Но когда я запускаю следующий код, он создает цикл и приложение, застрявшее для любого взаимодействия с пользователем.

import UIKit
class ExpandableView: UIView {

    @IBOutlet weak var userImgView: UIImageView!
    @IBOutlet weak var userNamelbl: UILabel!
    @IBOutlet weak var countLbl: UILabel!
    @IBOutlet weak var rightArrowImgView: UIImageView!
    var isExpanded = false
    var contentView: UIView!
    @IBOutlet weak var checkMarkView: UIImageView!

    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func draw(_ rect: CGRect) {
        // Drawing code
    }
    public override init(frame: CGRect) {
        super.init(frame: frame)
        setUpView()
    }

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

    private func setUpView() {
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: "ExpandableView", bundle: bundle)
        self.contentView = nib.instantiate(withOwner: self, options: nil).first as? UIView
        addSubview(contentView)
        contentView.center = self.center
        contentView.autoresizingMask = []
        contentView.translatesAutoresizingMaskIntoConstraints = true
    }
}

Я использую его следующим образом:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let frame = CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 60)
    let expandabelView = ExpandableView(frame: frame)
    return expandabelView
}

И это показывает следующую ошибку при запуске.

See Errors

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Так как вам нужно загрузить представление из nib , просто загрузите его, а затем добавьте подпредставление к вашему представлению. Затем установите frame представления содержимого и правильно установите маску автоматического изменения размера представления содержимого

private func setUpView() {
    Bundle.main.loadNibNamed("ExpandableView", owner: self, options: nil)
    addSubview(contentView)
    contentView.frame = bounds
    contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
}
0 голосов
/ 14 января 2019

Может быть много других способов, но я рекомендую вам сделать ваш ExpandableView многоразовым для повышения производительности.


Прежде всего , упростите ваш ExpandableView класс:

import UIKit

class ExpandableView: UITableViewHeaderFooterView {
    @IBOutlet weak var userImgView: UIImageView!
    @IBOutlet weak var userNamelbl: UILabel!
    @IBOutlet weak var countLbl: UILabel!
    @IBOutlet weak var rightArrowImgView: UIImageView!
    var isExpanded = false

    @IBOutlet weak var checkMarkView: UIImageView!
}

Пожалуйста, не пропустите, что суперкласс UITableViewHeaderFooterView, а не UIView.

Второй , проверьте настройки вашего ExpandableView.xib:

Для пользовательского вида для определенного вида должно быть ExpandableView.

Custom View of the view

Если вы не можете выбрать ExpandableView из выпадающего списка, вам может потребоваться ввести вручную. Не забудьте проверить Inherit Module From Target .

Параметр пользовательского просмотра владельца файла должен быть пустым.

File's Owner

Если какой-то класс уже установлен, удалите его вручную.

Убедитесь, что все розетки правильно подключены к вашему ExpandableView.

Outlets

(Вам лучше подключить их все после того, как вы изменили свой xib.)

Возможно, вам потребуется реструктурировать иерархию представления и / или ограничения .

Третий , измените контроллер представления, удерживая представление таблицы.

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        tableView.delegate = self
        tableView.dataSource = self
        //...
        let nib = UINib(nibName: "ExpandableView", bundle: nil)
        tableView.register(nib, forHeaderFooterViewReuseIdentifier: "ExpandableView")
        tableView.estimatedSectionHeaderHeight = 60
        tableView.sectionHeaderHeight = UITableView.automaticDimension
    }

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let expandabelView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "ExpandableView")
        // Frame size should be represented with constraints.
        return expandabelView
    }
0 голосов
/ 14 января 2019

Когда вы создаете пользовательский UIView, он должен следовать этому, если вы хотите использовать его init с рамкой.

class CustomView: UIView {
    //This should be contentview of your xib
    @IBOutlet var view: UIView!

    let nibName = "CustomView"

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

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

    private func xibSetup()
    {
        Bundle.main.loadNibNamed(nibName, owner: self, options: nil)
        self.view.autoresizesSubviews = true
        self.translatesAutoresizingMaskIntoConstraints = false

        self.addSubview(self.view)
        self.view.frame = self.frame


    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...