6

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

在这里,只有在 A 的 viewDidLoad 完成之后才能在 A 中分配属性。

例如,

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

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

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

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

4

8 回答 8

1

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

这将加载view/viewdidload。
请参阅 Apple 文档

于 2013-10-07T14:01:02.423 回答
1

根据我的经验,UIViewController无论您使用的是哪个 iOS 版本,都会延迟加载视图。如果您想触发视图加载,并因此触发它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";

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

于 2013-12-10T23:24:03.183 回答
0

没有文档提供足够的信息来准确了解何时viewDidLoad调用。

UIViewController 的文档就是这么说的

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

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

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

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

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

于 2013-12-10T20:08:01.240 回答
0

viewWillAppear请在方法中而不是viewDidLoad在下一个类中编写代码,即您将对象推送到的位置

-(void)viewWillAppear:(BOOL)animated
{

}
于 2013-12-09T05:03:41.533 回答
0

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

navigationController:didShowViewController:animated:

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

于 2013-12-04T22:34:57.257 回答
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;

控制器 A .m 文件:

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

    /* your viewDidLoad code here... */

    if ([_delegate respondsToSelector:@selector(controllerIsLoaded:status)])
        [_delegate controllerIsLoaded:self status:@"Loaded"];
}
于 2013-12-10T21:10:18.147 回答
0

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

[b.navController pushViewController:a animated:NO];
a.status = @"loaded";
于 2014-02-18T15:29:32.517 回答
-1

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

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

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

于 2013-12-05T13:10:48.647 回答