ViewDidLoad在推送viewcontroller时执行缓慢

时间:2013-10-02 21:40:26

标签: iphone ipad ios6 ios7 uivewcontroller

我试图将视图控制器B从A推入导航控制器,然后在A中分配B的一些属性 在这种情况下,完成了属性的分配,然后执行了viewcontroller A的viewDidLoad。

此处,只有在A的​​viewDidLoad完成后才能在A中分配属性。

例如,

[b.navController pushViewController:a animated:YES];
a.status = @"loaded";

此处,首先分配状态,然后执行A的viewDidLoad。 这只发生在iOS 7中,而在iOS6中它可以正常工作。

有谁能告诉我问题在哪里?

更新:对于我在某些情况下在iOS7中,推送视图无效。我如何调试和修复它?

8 个答案:

答案 0 :(得分:1)

在alloc init之后只需访问viewcontroller.view(在alloc之后立即设置任何东西);

这将是loadview / viewdidload。
See Apple Documentation

答案 1 :(得分:1)

根据我的经验,无论您正在处理哪个iOS版本,都会懒散地加载UIViewController视图。如果要触发视图加载,因此需要触发UIViewController viewDidLoad,则应在分配UIViewController后访问视图。例如:

UIViewController *aViewController = [[CustomViewController alloc] init];
[aViewController view];

确保您不将其编码为

aViewController.view

因为那会产生编译器警告。

所以,在你的情况下,它必须是这样的:

...
CustomViewController *a = [[CustomViewController alloc] init];
[b.navController pushViewController:a animated:YES];
[a view];
a.status = @"loaded";

如果您有其他问题,请告诉我。

答案 2 :(得分:0)

通过实现UINavigationControllerDelegate并将自己设置为委托self.navigationController.delegate = self;,您可以知道何时将视图控制器推入堆栈,然后您将在每次推送后获得此回调

navigationController:didShowViewController:animated:

因此,您可以检查所显示的viewController是否是您感兴趣的那个,然后设置您的a.status。

答案 3 :(得分:0)

请在下一课程中使用viewWillAppear方法代替viewDidLoad编写代码,即将对象推送到

的位置
-(void)viewWillAppear:(BOOL)animated
{

}

答案 4 :(得分:0)

没有文档提供足够的信息来确切知道何时调用viewDidLoad

UIViewController的文档只是说了这个

  

在视图控制器将其视图层次结构加载到内存

之后调用此方法

我建议您创建一个像这样的自定义初始化程序

- (id)initWithStatus:(NSString *)status {
}

但是,如果您尝试使用此变量来检查viewController的视图是否已“加载”,则可能无法执行此操作,因为不能保证pushViewController或presentViewController方法是同步的。

即使在iOS 6中,也没有明确保证在该方法返回后立即加载视图。

答案 5 :(得分:0)

我建议您在加载视图后调用委托方法。 将委托设置为控制器B. 并在viewDidLoad完成后(在控制器A中)调用委托方法。您甚至可以根据需要将参数传递给代理。

以下是一些示例代码:

控制器B:

a.delegate = self;
[b.navigationController pushViewController:a animated:YES];

实施委托方法:

- (void)controllerIsLoaded:(ControllerA *)controllerA status:(NSString *)status
{
    a.status = status;
}

控制器A .h文件:

@class ControllerA;

@protocol ControllerADelegate <NSObject>
- (void)controllerIsLoaded:(ControllerA *)controllerA status:(NSString *)status;
@end

@interface ControllerA : UIViewController 

@property (nonatomic, weak) id <ControllerADelegate> delegate;

Controller A .m文件:

- (void)viewDidLoad:(BOOL)animated
{
    [super viewDidLoad:animated];

    /* your viewDidLoad code here... */

    if ([_delegate respondsToSelector:@selector(controllerIsLoaded:status)])
        [_delegate controllerIsLoaded:self status:@"Loaded"];
}

答案 6 :(得分:0)

关闭ios7的动画,在我的情况下是它的工作

[b.navController pushViewController:a animated:NO];
a.status = @"loaded";

答案 7 :(得分:-1)

我理解你的问题是这样的:

B *b = [[B alloc] init];
b.status = @"loaded";
[self.navigationController pushViewController:b animated:Yes];

如果要将值从一个控制器传递给另一个控制器,则必须在使用pushViewController方法之前指定一个值。