关于ios:UIControllerView-加载之后UITableView-无法滑动到最底部

2次阅读

共计 1550 个字符,预计需要花费 4 分钟才能阅读完成。

我的项目中,须要在进入 UIViewController 后对它外面的 UITableView 滑动到最底部,那么须要把代码写在 viewDidLoad 中。

上面这一行代码要使得 previewTable 这个 UITableView 滑动到最底部的地位。(home.tickTasks 是我对代码中这个 tableView 的数据源,可依据理论须要设置)


self.previewTable.scrollToRow(at: IndexPath.init(row: (Home.tickTasks.count - 1), section: 0), at: .bottom, animated: false)

然而,不论是否须要动画,以上代码总是不能精确地滑动到指定地位,滑动的动作须要一点点工夫。

以下应用同步机制来期待一小段时间。

DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {self.previewTable.scrollToRow(at: IndexPath.init(row: (Home.tickTasks.count - 1), section: 0), at: .bottom, animated: false)
        }

猜测,是因为代码管制对 tableView 的滑动须要在 tableView 初始化好并且把 cell 的数据加载进来之后,如下代码,若这样写,则会呈现 tableView 划不到最底部的状况。

override func viewDidLoad() {super.viewDidLoad()
        
        bindTableView()    // 配置 tableView 的 dataSource、delegate 等信息
       
        loadFromCoreData() // 加载数据到 tableViewCell 中
        
        self.previewTable.scrollToRow(at: IndexPath.init(row: (Home.tickTasks.count - 1), section: 0), at: .bottom, animated: false)
        // 此时存在数据未加载实现但滑动动作异步执行,所以未滑到最底部,滑动就被终止了。}

问题出在于未加载实现就进行界面的滑动,所以咱们让对界面滑动略微提早 0.01 秒,如下代码所示

override func viewDidLoad() {super.viewDidLoad()
        bindTableView()
     
        loadFromCoreData()
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {self.previewTable.scrollToRow(at: IndexPath.init(row: (Home.tickTasks.count - 1), section: 0), at: .bottom, animated: false)
        } 
    }

此时就能够滑动到最底部了,但还有一个小问题,下面的 row 为 Home.tickTasks.count – 1,当 count 为 0 时程序会闪退,因为 index 越界了,所以像上面一样预先判断 count 即可解决问题。

override func viewDidLoad() {super.viewDidLoad()
        bindTableView()
        
        loadFromCoreData()
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
            if Home.tickTasks.count > 0 {self.previewTable.scrollToRow(at: IndexPath.init(row: (Home.tickTasks.count - 1), section: 0), at: .bottom, animated: false)
            }
        }
    }
正文完
 0