Iphone 按下viewcontroller时,ViewDidLoad执行缓慢
我试图将viewcontroller B从a推入导航控制器,然后在a中分配B的一些属性。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 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仅出现一次。是的,这是正确的。您可以维护一个全局变量,该变量将调用该方法,但由于条件的限制,它不会执行。视图对您有帮助吗?如果有,我可以进一步指导您获取代码