使属于 UIView 子类的计时器无效

Posted

技术标签:

【中文标题】使属于 UIView 子类的计时器无效【英文标题】:Invalidate a timer that belongs to a UIView subclass 【发布时间】:2013-02-04 11:55:13 【问题描述】:

我有一个属于 UIView 子类的重复计时器。

该类有一个可以加载它的 nib,我正在使用 ARC。

当 UIView 是...时,我想使计时器无效...

    已从其超级视图中删除 包含其 superView 的 ViewController 从堆栈中弹出。

我似乎在 UIView 上找不到类似 viewDidDisappear 的方法。

还有其他方法可以拦截吗?

目前,在 ViewController 弹出后,计时器不断触发并创建 NSLog 输出。

【问题讨论】:

【参考方案1】:

对于弹出的视图控制器:只需使用viewDidDisappear 或类似名称。还有UINavigationControllerDelegate 可能有用。

对于视图本身:您是否尝试过在UIView 中使用willMoveToSuperview: 方法?我尚未对此进行验证,但理论上,当视图从其父视图中删除时,该视图将移至父视图 nil

所以在你的观点中尝试以下方法:

- (void)willMoveToSuperview:(UIView *)superview 
    if (!superview) 
        // cancel timers
    

还有一个willRemoveSubview: 方法,但它会在父视图上调用,而不是被删除的视图。

【讨论】:

【参考方案2】:

您是否尝试过在dealloc 中使其无效

【讨论】:

以上是关于使属于 UIView 子类的计时器无效的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:在设备方向上重绘会使计时器无效

进入后台时使 NSTimer 无效

使 UIViewController 中的 NSTimer 无效以避免保留周期的最佳时间

当我使用 popOver 时,NSTimer 似乎无效

将 UIView 或 UIViewController 用于计时器对象?

在同一个 UIView 中多次点击手势检测