Элемент управления UIRefreshControl вращается навсегда после вставки новой строки - PullRequest
0 голосов
/ 24 мая 2018

У меня есть UITableView, который в делегате UIViewController, который добавляет новый элемент, вставляет строку.Строка вставлена ​​правильно.

Однако UIRefreshControl на UITableView не исчезнет при перетаскивании UITableView после этого.

extension FeedViewController: AddPostDelegate {
    func didAddPost(_ userPost: UserPost) {
        self.postsWrapper?.posts.insert(PostWrapper(type: PostType.user(userPost)), at: 0)
        self.tableView.beginUpdates()
        self.tableView.insertRows(at: [
            IndexPath(row: 1, section: 0)
            ], with: .automatic)
        self.tableView.endUpdates()
        self.refresher.endRefreshing()//Does nothing
    }
}

In viewDidLoad:

refresher = UIRefreshControl()
tableView.addSubview(refresher)
refresher.addTarget(self, action: #selector(didDragScrollView), for: .valueChanged)
refresher.layer.zPosition = -1//otherwise in front of the header cell when refreshing (iOS 9.2)

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

РЕДАКТИРОВАТЬ: Похоже, что UIRefreshControl больше не вызывает целевой функции ПОСЛЕ того, как я добавлю сообщение.

Любые идеи о том, почему это может происходить?Как это исправить?

Ответы [ 2 ]

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

Убедитесь, что beginRefreshing() не был вызван, прежде чем пользователь потянул для обновления.Если refreshControl.isRefreshing равно true, то селектор не вызывается при «вытягивании для обновления».

Простой тест:

let refreshControl = UIRefreshControl()

override func viewDidLoad() {
    super.viewDidLoad()

    refreshControl.addTarget(self, action: #selector(ViewController.refreshData), for: .valueChanged)
    tableView.refreshControl = refreshControl
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    // sets refreshControl.isRefreshing to true
    // before the user initiates it
    refreshControl.beginRefreshing()
}

Затем пользователь нажимает для обновления.Поскольку refreshControl.isRefreshing равно true, селектор не будет вызван.Если вы удалите refreshControl.beginRefreshing() в viewDidAppear, селектор будет вызван:

@objc func refreshData() {
    print("refresh initiated")
    refreshControl.endRefreshing()
}
0 голосов
/ 24 мая 2018

Попробуйте присвоить UIRefreshControl свойству refreshControl UITableView следующим образом:

if #available(iOS 10.0, *) {
    tableView.refreshControl = refresher
} else {
    tableView.addSubview(refresher)
}

Обратите внимание, что для этого требуется iOS 10.0 или выше, но мы скоро получим iOS 12.0, поэтому яне думаю, что вы должны поддерживать iOS ниже 10.0

...