还有其他人遇到过这个吗?在iOS 4模拟器上运行时,以下代码报告“YES”,但根据Apple文档,addChildViewController方法仅适用于iOS 5及更高版本。这似乎不是正确的行为,这是一个错误吗?
if([UIViewController instancesRespondToSelector:@selector(addChildViewController:)]) {
NSLog(@"YES");
} else {
NSLog(@"NO");
}
答案 0 :(得分:3)
我认为这是一个错误。调用addChildViewController似乎也没有任何警告或错误。
我写了以下viewDidLoad:
- (void)viewDidLoad
{
[super viewDidLoad];
MyChildView *aChildViewController = [[MyChildView alloc] initWithNibName:@"MyChildView" bundle:nil];
// Do any additional setup after loading the view, typically from a nib.
SEL mySelector = @selector(addChildViewController:);
if([UIViewController instancesRespondToSelector:mySelector] == YES) {
NSLog(@"YES addChildViewController:");
[self addChildViewController:aChildViewController];
} else {
NSLog(@"NO addChildViewController:");
}
if([UIViewController instancesRespondToSelector:@selector(automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers)] == YES) {
NSLog(@"YES automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers");
} else {
NSLog(@"NO automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers");
}
}
在iOS 4.3模拟器中,我看到以下输出。这两条消息仅限于IOS 5.0及更高版本。看来addChildViewController在4.3模拟器中的响应不正确。我没有4.3设备在实际设备上进行测试。
2011-11-18 09:55:12.161 testViewFunctionality[873:b303] YES addChildViewController:
2011-11-18 09:55:12.162 testViewFunctionality[873:b303] NO automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
在iOS 5.0模拟器中,两者都会响应哪种行为是正确的。
2011-11-18 09:59:31.250 testViewFunctionality[932:f803] YES addChildViewController:
2011-11-18 09:59:31.252 testViewFunctionality[932:f803] YES automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
我在Lion上使用XCode 4.2。当我在4.3模拟器的框架上查看UIViewController.h时,没有提到 addChildViewController:或 automaticForwardAppearanceAndRotationMethodsToChildViewControllers ,但是唯一包含的SDK是5.0。
我想如果你想要小心,你可以在正在运行的设备上测试正在运行的iOS版本。见How to check iOS version?
答案 1 :(得分:0)
是的,这是一个错误,它永远不会被修复。要解决此问题,您可以检查addChildViewController:
方法,而不是检查removeFromParentViewController
方法的可用性。后者在iOS 5.0之前不可用。
答案 2 :(得分:0)
这种方法很可能存在于以前版本的iOS中,但它还没有公开。 Apple通常使用下划线来假装私有方法,但之前已经知道这样做了。