是否有必要在viewWillAppear中调用super?

时间:2015-09-15 19:24:15

标签: ios objective-c viewwillappear viewdidappear

我试图理解调用方法调用的方案/会出现和消失。

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

以下是我的方法:

-(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中使用超级调用,则没有延迟并且单元格正在被删除(大约<0.5秒)

我不确定是否使用超级电话。

有谁能告诉我为什么取消选择细胞有延迟?

3 个答案:

答案 0 :(得分:6)

是的,documentation表示您必须:

  

<强>讨论

     

在接收者的视图之前调用此方法   要添加到视图层次结构中,并且在任何动画之前   配置为显示视图。您可以覆盖此方法   执行与显示视图相关的自定义任务。例如,   您可以使用此方法来更改方向或样式   状态栏以与视图的方向或样式进行协调   被提出。 如果您覆盖此方法,则必须至少调用super   实施中的某些内容

答案 1 :(得分:1)

一般来说,请致电super。我忘记了导航控制器中发生了奇怪的事情。

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

答案 2 :(得分:0)

是的,有必要写超级。