Как создать и использовать свой собственный протокол источника данных в Swift? - PullRequest
0 голосов
/ 22 февраля 2019

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

Поэтому я хотел бы следовать протоколу UITableViewDataSource и пытаться реализовать что-то подобное.

// CustomView.swift

protocol CustomViewDatasource: class {
   func heightForHeader(in view: CustomView) -> CGFloat
   func headerView(in view: CustomView) -> UIView
}

class CustomView: UIView {
   weak var dataSource: CustomViewDatasource?
   /// How can I draw the custom header view passing by dataSource?
}

// ViewController.swift

extension ViewController: CustomViewDatasource {

  ...

  func headerView(in view: CustomView) -> UIView {
    let headerView = UIView()
    headerView.backgroundColor = .green
    return headerView
  }

  func heightForHeader(in view: CustomView) -> CGFloat {
    return 150
  }
}

Как нарисовать представление заголовка, передавая dataSource?

без понятия.Буду признателен за любую помощь.

Спасибо.

1 Ответ

0 голосов
/ 23 февраля 2019

Позвонив в свой CustomView.

class CustomView: UIView {

    private let headerViewTag = 42

    weak var dataSource: CustomViewDatasource? {
        didSet {
            updateHeaderView()
        }
    }

    private func updateHeaderView() {
        // remove the old one
        viewWithTag(headerViewTag)?.removeFromSuperview()

        // ask for customized data
        let headerView = dataSource?.headerView(in: self) ?? defaultHeaderView()
        let headerViewHeight = dataSource?.heightForHeader(in: self) ?? 100

        headerView?.translatesAutoresizingMaskIntoConstraints = false
        headerView?.tag = headerViewTag

        if let headerView = headerView {
            addSubview(headerView)
            // set your constraints
        }
    }

    private func defaultHeaderView() -> UIView {
        // default header view's implementation here
    }

}
...