tableView.setContentOffset не работает на UITableView, встроенном в UIViewcontroller - PullRequest
0 голосов
/ 21 мая 2018

У меня был этот код в UITableViewController, и он отлично работал.

func setupSearchBar() {
    let searchBar: UISearchBar = searchController.searchBar
    tableView.tableHeaderView = searchBar

    let point = CGPoint(x: 0, y: searchBar.frame.size.height)
    tableView.setContentOffset(point, animated: true    
}

Теперь я реорганизую свой код, чтобы он больше соответствовал архитектуре стиля MVC.Я создал UITableView в классе View:

class View: UIView {
   lazy var tableView: UITableView = {
      let table = UITableView()
      table.translatesAutoresizingMaskIntoConstraints = false
      return table
   }()

    func configureView() {

       // tableView
       addSubview(tableView)
       tableView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
       tableView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
       tableView.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
       tableView.heightAnchor.constraint(equalTo: heightAnchor).isActive = true
    }
}

, а затем использовал класс View в моем ViewController:

class ViewController: UIViewController {

    var newView: View! { return self.view as! View }

    override func loadView() {
        view = View(frame: UIScreen.main.bounds)
        newView.configureView()
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        setupSearchBar()    
    }

    func setupSearchBar() {
        let searchBar: UISearchBar = searchController.searchBar
        newView.tableView.tableHeaderView = searchBar

        let point = CGPoint(x: 0, y: searchBar.frame.size.height)
        newView.tableView.setContentOffset(point, animated: true)   
    }

TableView не показывает никаких проблем, а все остальноехорошо.Единственное, что не работает, это то, что вызывается setContentOffset, но это не компенсирует содержимое.Я хочу, чтобы панель поиска была скрыта по умолчанию, когда пользователь впервые открывает этот viewController (аналог iMessage), но после того, как я переместил код из UITableViewController в отдельные файлы (UIView + UIViewController), как в этом примере, панель поиска всегда отображается по умолчанию.

Я не уверен, почему это не работает.Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 21 мая 2018

Вероятно, это проблема синхронизации относительно макета.Вместо того, чтобы вызывать setUpSearchBar в viewDidLoad, сделайте это позже, в viewDidLayoutSubviews, когда начальная компоновка действительно произошла.Этот метод может вызываться много раз, поэтому используйте флаг, чтобы предотвратить его повторный вызов:

var didSetUp = false
override func viewDidLayoutSubviews() {
    if !didSetUp {
        didSetUp = true
        setUpSearchBar()
    }
}

Также: Ваше animated значение неверно:

newView.tableView.setContentOffset(point, animated: true)

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

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