我试图将视图控制器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中,推送视图无效。我如何调试和修复它?
答案 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方法之前指定一个值。