Iphone 按下viewcontroller时,ViewDidLoad执行缓慢

Iphone 按下viewcontroller时,ViewDidLoad执行缓慢,iphone,ipad,ios6,ios7,uivewcontroller,Iphone,Ipad,Ios6,Ios7,Uivewcontroller,我试图将viewcontroller B从a推入导航控制器,然后在a中分配B的一些属性。 在本例中,完成了属性的分配,然后执行viewcontroller A的viewDidLoad 在这里,只应在A的viewDidLoad完成后才能在A中指定属性 比如说, [b.navController pushViewController:a animated:YES]; a.status = @"loaded"; 在这里,首先分配状态,然后执行一个的viewDidLoad。 这只发生在iOS 7中,而

我试图将viewcontroller B从a推入导航控制器,然后在a中分配B的一些属性。
在本例中,完成了属性的分配,然后执行viewcontroller A的viewDidLoad

在这里,只应在A的viewDidLoad完成后才能在A中指定属性

比如说,

[b.navController pushViewController:a animated:YES];
a.status = @"loaded";
在这里,首先分配状态,然后执行一个的
viewDidLoad
。 这只发生在iOS 7中,而在iOS 6中工作正常

谁能告诉我问题出在哪里吗


更新:对我来说,在iOS7的某些情况下,Push视图不起作用。如何调试和修复它?

只需在alloc init之后访问viewcontroller.view(在alloc之后立即设置任何内容)属性

它将加载View/viewdidload

通过实现
UINavigationControllerDelegate
并将自己设置为代理
self.navigationController.delegate=self,您可以知道视图控制器何时被推到堆栈上然后每次推送后都会收到此回调

navigationController:didShowViewController:animated:

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

我理解您的问题如下:

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

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

请在下一个类(即将对象推送到的类)的
视图将出现
方法中编写代码

-(void)viewWillAppear:(BOOL)animated
{

}

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

UIViewController的文档只是这样说的

在视图控制器将其视图层次结构加载到内存后,将调用此方法

我建议您创建这样的自定义初始值设定项

- (id)initWithStatus:(NSString *)status {
}
但是,如果试图使用此变量检查viewController的视图是否已“加载”,则可能无法执行此操作,因为不能保证pushViewController或presentViewController方法是同步的


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

我建议您在加载视图后调用委托方法。 将代理设置为控制器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;

根据我的经验,
UIViewController
视图是延迟加载的,无论您使用的是哪个iOS版本。如果要触发视图加载,并因此触发其
UIViewController
viewDidLoad
,则应在分配UIViewController后访问该视图。例如:

UIViewController *aViewController = [[CustomViewController alloc] init];
[aViewController view];
确保您没有将其编码为

aViewController.view
因为这将生成编译器警告

因此,在你的情况下,它必须是这样的:

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

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

关闭ios7的动画,在我的例子中,它可以正常工作

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

你能提供更多的代码吗?可能还有其他原因导致viewDidLoad:执行。请注意,每次调用视图时都会调用ViewWillDisplay。.well-出现(可能多次出现)-而不是作为viewDidLoad仅出现一次。是的,这是正确的。您可以维护一个全局变量,该变量将调用该方法,但由于条件的限制,它不会执行。视图对您有帮助吗?如果有,我可以进一步指导您获取代码