【问题标题】:viewDidAppear for UITableViewCellUITableViewCell 的 viewDidAppear
【发布时间】:2012-06-02 02:09:55
【问题描述】:

我通常在视图完成显示后使用viewDidAppear 方法在视图上做一些UI 工作,我在各种情况下都使用了这种方法,它非常有用,但是,我需要在UITableViewCell 上做一些UI 更改在它完成出现后,SDK 中是否有任何可用的方法可以像 viewDidAppear 但对于 UITableViewCell 做类似的工作?

附言willDisplayCell 在我的情况下不起作用,如果它真的存在,我需要像 didDisplayCell 这样的东西。

【问题讨论】:

  • 你能过去一些正在使用的代码吗..你想要实现什么......即UI变化的意义是什么变化..你能解释一下吗..跨度>
  • 看看这个问题的答案:当 UITableView 完成请求数据时收到通知? stackoverflow.com/a/3060232/1028709
  • 你不能直接在 init 中为你的表格单元子类做事情的原因是什么?为什么willDisplayCell 不适合你?
  • @Mattias - 我有一个复杂的情况,无法在这里解释,但简而言之,在创建单元格后,单元格子视图的某些框架在创建视图后发生更改,所以我需要在单元格出现后修复这些帧。

标签: iphone objective-c ios uitableview viewdidappear


【解决方案1】:

UITableViewDelegate 具有以下功能:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath)

单元格本身没有回调。

【讨论】:

    【解决方案2】:

    如果需要响应单元格框架的变化并调整布局,需要在单元格类中实现-layoutSubviews。记得拨打[super layoutSubviews]

    【讨论】:

    • layoutSubviews 的问题是它总是在单元格出列时被调用。如果您只需要在首次设置单元格时进行一次帧更改,您可以在 awakeFromNib 中进行。这样做的问题是您无法从那里的自动布局中获得调整后的单元格边界,只能在 layoutSubviews 中。
    【解决方案3】:

    viewDidLoad 方法与 UIViewController 及其子类相关,所以我们不能在 UITableViewCell 中使用它,它是 UIView 的子类。我在我的一个应用程序中使用的解决方案是覆盖 UITableViewCell 的layoutSubViews 方法,并且我将操作延迟了一段时间,如下所示。

    - (void)layoutSubViews
    {
         [super layoutSubviews];
    
         [self performSelector:@selector(myMethod) withObject:nil afterDelay:1.0];
    }
    

    【讨论】:

    • 在您的 UI 配置中使用延迟?对我来说,这似乎是一种可怕的做法,不是吗?
    • 确实是可怕的做法。
    • 对于任何引用它的人 - 方法名称是layoutSubviews(注意大小写),您还应该调用[super layoutSubviews]
    • 12 票赞成“可怕的做法”评论,但没有更好的建议?
    • 有什么解决办法吗?我没有找到 UITableviewCell 确实查看的事件,所以我在延迟 0.1 之后成功地做到了。
    【解决方案4】:

    您可以使用didMoveToSuperview 并在那里进行单元格更新

    override func didMoveToSuperview() {
        super.didMoveToSuperview()
    
        if superview != nil {
            // Update the cell
        }
    }
    

    如果您需要更快的东西,请使用willDisplayCell

    func tableView(_ tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        // Update the cell
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多