当视图不再位于视图堆栈顶部时的事件

Posted

技术标签:

【中文标题】当视图不再位于视图堆栈顶部时的事件【英文标题】:Event for when a view is no longer on top of the view stack 【发布时间】:2014-09-23 15:08:03 【问题描述】:

有没有办法判断视图何时不再位于视图堆栈顶部?例如,模态视图被推到视图堆栈的顶部?

所以我有一个带有表格视图的视图,并且有一些事件会导致显示模式。当模式被解除时,我想重新加载表中的数据。

是否有我可以订阅的事件来实现这一目标?也许这可以通过 KVO 实现?

【问题讨论】:

【参考方案1】:

您可以使用 NSNotification 系统。

在您的 UITableViewController 中,您将注册 NSNotification(假设 NSString *notifName = @"dismissmv"):

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hasDismissed:) notifName object:nil];

并实施

-(void)hasDismissed:(NSNotification *)notification

然后,当您关闭视图控制器时,您将发布通知:

    [self dismissViewControllerAnimated:true completion:^[[NSNotificationCenter defaultCenter] postNotificationName:notifName object:nil];];

【讨论】:

我想到了类似的东西,但是我必须在我显示的每个视图控制器中手动发布通知。展示了几种不同的模式,未来可能会添加更多模式。我最终使用了在我感兴趣的数据发生变化时发布的自定义通知。【参考方案2】:

您可以使用其subviews 属性在容器视图中找到子视图的顺序。

来自文档:

@property(nonatomic, readonly, copy) NSArray *subviews

讨论

您可以使用此属性来检索与 您的自定义视图层次结构。数组中子视图的顺序 反映它们在屏幕上的可见顺序,视图位于索引 0 是最后面的视图。

对于在 UIKit 和其他系统框架中声明的复杂视图,任何 视图的子视图通常被认为是私有的并且受制于 随时改变。因此,您不应尝试检索或 修改这些类型的系统提供的视图的子视图。如果你这样做, 您的代码可能会在未来的系统更新期间中断。

【讨论】:

以上是关于当视图不再位于视图堆栈顶部时的事件的主要内容,如果未能解决你的问题,请参考以下文章

特定部分应位于表格视图的顶部

相对视图停留在布局顶部

iOS中的堆栈视图问题

左对齐的水平堆栈视图和顶部对齐的垂直堆栈视图

当按钮覆盖在表格视图顶部时,如何防止表格视图单元格注册点击?

如何为嵌入在另一个堆栈视图中的堆栈视图设置顶部布局约束?