(Swift 3)我们如何在 ViewDidAppear() 之前进入单元格?我想在用户进入此控制器后立即显示单元格

Posted

技术标签:

【中文标题】(Swift 3)我们如何在 ViewDidAppear() 之前进入单元格?我想在用户进入此控制器后立即显示单元格【英文标题】:(Swift 3) How can we go to cell before ViewDidAppear() ? I want to show the cell just after user goes to this controller 【发布时间】:2017-08-31 08:10:02 【问题描述】:
override func viewDidLoad() 
    super.viewDidLoad()


override func viewDidAppear(_ animated: Bool) 
    let indexPath = IndexPath(row: 12, section: 0)
    let theCell:UITableViewCell? = tableView.cellForRow(at: indexPath as IndexPath)

    if let theCell = theCell 
        var tableViewCenter:CGPoint = tableView.contentOffset
        tableViewCenter.y += tableView.frame.size.height/2

        tableView.contentOffset = CGPoint(x:0, y:theCell.center.y-(theCell.frame.size.height))
        tableView.reloadData()
    


override func numberOfSections(in tableView: UITableView) -> Int 
    return 1


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return jo.count


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    cell.textLabel?.text = jo[indexPath.row]
    return cell
     

当我转到此视图时,我希望消息自动滚动到我将提供的索引路径,并且用户应该看不到滚动动画,它应该在视图出现之前出现?

【问题讨论】:

【参考方案1】:

在你的表格视图上使用这个方法:

Apple doc

func scrollToRow(at indexPath: IndexPath, 
              at scrollPosition: UITableViewScrollPosition, 
        animated: Bool)

用法:

tableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.middle, animated: false)

在你的情况下:

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)

    tableView.reloadData()
    let indexPath = IndexPath(row: 12, section: 0)
    tableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.middle, animated: false)

【讨论】:

在哪里调用这个函数,因为我希望用户在视图出现时看不到滚动,它应该在那个索引处? viewWillAppear(),但也可以试试 viewDidAppear() 看看有什么不同 我们不能在 viewWillAppear 中使用因为下面的函数被执行了,这意味着单元格没有被创建。 override func numberOfSections(in tableView: UITableView) -> Int return 1 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int return jo.count override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = jo[indexPath.row] return cell 是的,但在这种情况下,用户可以看到滚动,我不希望用户看到滚动 调用viewDidLayoutSubviews中的代码,应该可以了。 override func viewDidLayoutSubviews() super.viewDidLayoutSubviews() // 在这里调用

以上是关于(Swift 3)我们如何在 ViewDidAppear() 之前进入单元格?我想在用户进入此控制器后立即显示单元格的主要内容,如果未能解决你的问题,请参考以下文章

(Swift 3)我们如何在 ViewDidAppear() 之前进入单元格?我想在用户进入此控制器后立即显示单元格

如何一次推送一些带有 segue 的视图控制器

如何使用 Swift 在文本字段(从右到左)上输入货币格式?

如何使用 Swift 在文本字段(从右到左)上输入货币格式?

Swift 3. NSFetchRequest propertiesToFetch

使用Swift 3单击collectionView单元格内的项目时如何导航另一个视图控制器