【问题标题】:Is it necessary to call super in viewWillAppear?viewWillAppear中是否需要调用super?
【发布时间】:2023-04-04 05:40:02
【问题描述】:

我正在尝试了解对视图进行/将出现和消失的方法调用的场景。

我所做的是选择表格单元格(灰色突出显示),转到详细视图并返回并取消选择所选行(删除所选单元格灰色)。

这是我的方法:

-(void)viewDidAppear:(BOOL)animated {
    DLog(@"%@ did appear", self);
    [super viewDidAppear:animated];

    if (_isPushed) {
        [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
        _isPushed=NO;
    }
}

-(void)viewWillAppear:(BOOL)animated {
    DLog(@"%@ will appear", self);
    [super viewWillAppear:animated];  //If I remove this super call , then it works fine and there is no delay in deselecting the table cell
}

-(void)viewWillDisappear:(BOOL)animated {
    DLog(@"%@ will disappear", self);
    [super viewWillDisappear:animated];
}

-(void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    _isPushed=YES;
}

所以,当我设置断点时,流程是这样的:

没有超级调用:

在推送到新的 VC 时:

current viewWillDisappear    //makes sense
new viewWillAppear           //makes sense
current viewDidAppear         // doesnt make sense , y this should get called as the view is already appeared?
current viewWillDisappear     // make sense
current viewDidDisappear      //make sense
new viewDidAppear           //make sense

从推送的 VC 回来时:

current viewWillDisappear
new viewDidDisappear
current viewDidDisappear
new viewDidAppear

带有超级调用:

在推送到新的 VC 时:

current viewWillDisappear
new viewWillAppear
current viewDidAppear
current viewWillDisappear
current viewDidDisappear
new viewDidAppear

从推送的 VC 返回时:

current viewWillDisappear
new viewDidDisappear
current viewDidDisappear
new viewDidAppear

无论我是否使用超级调用,流程都几乎相同。 但是我面临的问题是,当我在 viewWillAppear 中使用超级调用时,在取消选择单元格时会有延迟(大约 >1 秒)。

如果我不使用 viewWillAppear 中的超级调用,则没有延迟并且单元格正在取消选择(大约

我不确定是否使用超级呼叫。

谁能告诉我为什么取消选择单元格会有延迟?

【问题讨论】:

  • 如果您不添加任何代码,请不要添加方法。 Apple 模板添加了可能有用的"Boilerplate" 方法,如果您不需要它们,即不需要向它们添加代码,请将它们删除。在此示例中,您可以只删除方法:viewWillAppearviewWillDisappear

标签: ios objective-c viewwillappear viewdidappear


【解决方案1】:

是的,documentation 声明您必须:

讨论

这个方法在接收者的视图即将到来之前被调用 被添加到视图层次结构中并且在任何动画之前 配置为显示视图。您可以覆盖此方法以 执行与显示视图相关的自定义任务。例如, 您可以使用此方法来更改方向或样式 与视图的方向或样式协调的状态栏 被呈现。 如果你重写这个方法,你必须调用super at 实施中的某个点

【讨论】:

  • 我对覆盖的名称感到困惑。如您所见,viewWillAppear 不包含任何代码,那么重写该方法有什么意义呢?
  • 我在viewDidAppear中调用了super,因为我在里面写了一些代码,需要重写!!!
  • 这意味着当你覆盖基类​​实现时,就像你所做的那样。
  • 延迟取消选择单元定义意味着 viewDidappear 被延迟调用?或者问题出在哪里?
【解决方案2】:

通常是的,请致电super。当我忘记时,我看到导航控制器中发生了奇怪的事情。

在这种情况下,如果您有 UITableViewController,请尝试使用其clearsSelectionOnViewWillAppear 标志为您清除选择。

【讨论】:

  • 我在一个组织工作,他们不使用 tableviewcontrollers。到处都是表格视图!!!!
  • 尝试将取消选择放在 viewWillAppear 而不是 viewDidAppear 中。
  • 在这种情况下,选择会立即取消选择。
  • 当然......虽然用performSelector: withDelay:0.2 包裹起来很容易,对吧?您可以微调以使选择在您想要的时候完全消失。
【解决方案3】:

是的,必须写super。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 2020-05-17
    相关资源
    最近更新 更多