iOS segue 慢 - 即使没有对destinationViewController 进行任何处理

Posted

技术标签:

【中文标题】iOS segue 慢 - 即使没有对destinationViewController 进行任何处理【英文标题】:iOS segue slow - even without any processing on destinationViewController 【发布时间】:2015-02-09 21:35:34 【问题描述】:

我有一个连接到新视图控制器的按钮。当我按下按钮时,在新的视图控制器出现之前有一个可见的 3-4 秒延迟。我已经阅读了有关 *** 的其他问题,通常问题出在 destinationViewController 或 sourceViewController 上的代码(尚未完成)。就我而言,如果我在destinationViewController 上的viewDidLoad 上设置断点,则延迟甚至会在该代码执行之前发生。

另外,我的代码不会做任何应该花费超过一毫秒的事情。

这是我的destinationViewController 的代码。我在 prepareForSegue... 方法中没有任何内容,仅供参考。

如何摆脱这种延迟?谢谢!

如果您需要其他方法来诊断此问题,请随时提出,谢谢。

#import "ViewSettingsViewController.h"

@interface ViewSettingsViewController ()

@end

@implementation ViewSettingsViewController

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    if ([HelperMethods getUserPreference:@"notificationTime"]==nil) 
        NSDate * now = [[NSDate alloc] init];
        NSCalendar *cal = [NSCalendar currentCalendar];
        NSDateComponents * comps = [cal components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:now];
        [comps setHour:19];
        [comps setMinute:0];
        [comps setSecond:0];
        NSDate * date = [cal dateFromComponents:comps];
        [self.timePicker setDate:date animated:TRUE];
     else 
        [self.timePicker setDate:[HelperMethods getUserPreference:@"notificationTime"]];
    


- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.

*/

-(void) viewWillDisappear:(BOOL)animated 
    if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) 
        // back button was pressed.  We know this is true because self is no longer
        // in the navigation stack.
        [HelperMethods setUserPreference:self.timePicker.date forKey:@"notificationTime"];

    
    [super viewWillDisappear:animated];


@end

【问题讨论】:

确实很难查明,但解决问题的一个好方法是创建一个带有单个 segue 的全新项目 - 一点一点地添加您正在使用的代码,看看它从哪里开始延迟。这也可能与 Interface Builder 中的某些内容或 AutoLayout 相关。 当目标视图中的约束是“复杂”时,我看到了类似的行为。复杂可能意味着很多事情。在我的例子中,父视图中的 7 个按钮都被限制为相同的大小。在纵向模式下加载速度很快,在横向模式下加载需要几秒钟。我会使用 Instruments 来查看所有时间的去向。如果它被似乎在自动布局深处的方法所消耗,那可能是你的问题。 目标视图控制器只有一个标签和一个日期选择器:s。自动布局相当简单。 我遇到了同样的问题,这最终解决了问题:***.com/questions/26165700/… 【参考方案1】:

想通了。原来滞后时间在这一行:

[super viewDidLoad] 

从destinationViewController viewDidLoad 方法调用。那是重新加载每次启动 segue 的视图,这是一种繁重的方法。我评论了那条线并解决了这个问题。不知道为什么我每次都想重新加载超级视图...

【讨论】:

【参考方案2】:

你有没有代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

我确实有[self.tableView deselectRowAtIndexPath:indexPath animated:YES];

我尝试将它添加到 dispatch_get_main_query 中,现在又顺利了。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    dispatch_async(dispatch_get_main_queue(), ^
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    );

【讨论】:

以上是关于iOS segue 慢 - 即使没有对destinationViewController 进行任何处理的主要内容,如果未能解决你的问题,请参考以下文章

在 segue.destination 中使用 ViewController 变量

performSegueWithIdentifier 方法对于模态 segue 非常慢

使用带有情节提要参考的“Unwind Segue”时“没有标识符的segue”

iOS:在 segue 中无法同时满足约束

TreeMap没有正确排序

在发送者视图控制器被解雇后执行 segue