#ios #swift #pull-to-refresh
Вопрос:
У меня есть UIViewController с панелью навигации, которая является частью UITabController.
Внутри UIViewController у меня есть только UITableView.
Панель навигации прозрачна и размыта.
Верхнее ограничение TableView-это просмотр, поэтому, когда я прокручиваю содержимое, оно находится за панелью навигации.
У меня включены большие заголовки:
Проблема:
Данные loadData срабатывают сразу же, как только я начинаю прокручивать вниз. Сразу после того, как я прокручу несколько пикселей вниз.
Все работает нормально, если я удаляю большие заголовки, но с большими заголовками кажется, что refreshControl уже находится в положении, когда он готов к запуску .valueChanged
Также он отлично работает, если удалить панель вкладок и загрузить NavigationController непосредственно как root. Но мне нужна панель вкладок.
Полный код:
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let window = UIWindow(frame: UIScreen.main.bounds)
window.makeKeyAndVisible()
self.window = window
window.rootViewController = TabBarController()
return true
}
}
class TabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
let navigationController = UINavigationController(rootViewController: ViewController())
navigationController.navigationBar.prefersLargeTitles = true
viewControllers = [navigationController]
}
}
class ViewController: UIViewController {
private let tableView = UITableView()
private let refreshControl = UIRefreshControl()
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.title = "Test"
view.addSubview(tableView)
tableView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
tableView.delegate = self
tableView.dataSource = self
tableView.refreshControl = refreshControl
refreshControl.addTarget(self, action: #selector(loadData), for: .valueChanged)
}
@objc func loadData() {
print("loadData triggered")
DispatchQueue.main.asyncAfter(deadline: .now() 3.0) {
self.refreshControl.endRefreshing()
}
}
}
extension ViewController: UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell: UITableViewCell
if let defaultCell = tableView.dequeueReusableCell(withIdentifier: "defaultCell") {
cell = defaultCell
} else {
cell = UITableViewCell(style: .value1, reuseIdentifier: "defaultCell")
}
cell.textLabel?.text = "Test"
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
10
}
}
но
Комментарии:
1. Мне кажется, что я читал ту же тему несколько часов назад.
2. @ElTomato Я опубликовал это час назад. Но затем удалил и подготовил код, чтобы было понятно, что я делаю, и подготовил код, который легко попробовать