iOS 9 pushViewController 不工作,在 iOS 8 中一切正常,零代码更改?
iOS 9 pushViewController not working, in iOS 8 everything works as expected, zero code changes?
当我使用 pushViewController
时,会调用 viewWillDisappear
(第一个视图控制器)。在那之后,屏幕冻结,因此没有执行任何操作,我将断点放在 nextviewcontroller
上,它不会在 viewDidLoad
方法中调用。
//first View Controller from where pushViewController
[[AppCommonFunctions sharedInstance]pushVCOfClass:[NextViewController class] fromNC:[self navigationController] animated:YES popFirstToVCOfClass:nil modifyVC: ^(id info) {
[((NextViewController *)info)setEventInfo : object];
}];
//common method for push view controller in another file
- (void)pushVCOfClass:(Class)class1 fromNC:(UINavigationController *)nc animated:(BOOL)animated popFirstToVCOfClass:(Class)class2 modifyVC:(operationACFFinishedBlock)modify {
RESIGN_KEYBOARD
[self popToViewControllerOfKind : class2 from : nc];
UIViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:[class1 description]];
if (modify) {
modify(vc);
modify = nil;
}
[nc pushViewController:vc animated:animated];
}
- (UIViewController *)popToViewControllerOfKind:(Class)aClass from:(UINavigationController *)navController {
RESIGN_KEYBOARD
if (aClass) {
NSArray *arrayOfViewControllersInStack = navController.viewControllers;
for (int i = 0; i < arrayOfViewControllersInStack.count; i++) {
if ([[arrayOfViewControllersInStack objectAtIndex:i] isKindOfClass:aClass]) {
int index = (i > 0) ? (i - 1) : i;
[navController popToViewController:[arrayOfViewControllersInStack objectAtIndex:index] animated:NO];
break;
}
}
return [navController topViewController];
}
return nil;
}
我也遇到这个问题。我发现 CPU 使用率在 pushViewController:animated:
之后是 100%,并且 运行 循环卡住了。视图控制器无法加载 loadView
中的视图。
loadView
进程可能在 iOS 9 中被内部更改,或者 storyboard/xib 文件由于 Xcode 7 而被错误构造(可能只是一个错误)。
第一步,尝试在推送前加载视图
我尝试打印 view
属性 以强制视图控制器调用 loadView
。
UIViewController *vc = ...;
NSLog(@"vc.view: %@", vc.view); // Never print
[self.navigationController pushViewController:vc animated:YES];
我发现在调用 view
属性 时无法加载视图。 NSLog()
不会打印视图对象,运行 循环卡住。
第2步,加载视图时显示调用堆栈
在目标视图控制器中添加以下 loadView
实现。
- (void)loadView
{
NSLog(@"will loadView");
[super loadView];
NSLog(@"did loadView");
}
构建并 运行 您的应用程序,并尝试通过调用 属性 view
来触发 loadView
。现在您应该会发现该应用程序卡在目标视图控制器中的 [super loadView]
。
现在尝试多次暂停执行(Debug » Pause,或cmd + ctrl + Y
),您应该会发现应用程序(运行loop)几乎卡在了某些特定的方法上。在我的例子中,我的应用程序卡在 -[NSLocalizableString length]
(或 objc_msgSend
)。
我认为这是调试的提示(我的视图控制器是通过故事板构建的,故事板直接在项目中本地化)。
更新
我通过版本控制(git)将故事板文件重置为以前的版本后,应用运行良好,视图加载成功。
如果您的 NextViewController 有任何 UITextView,您必须在情节提要中提供其 默认文本值 并通过执行此操作从代码中更改其值,它对我来说很好,您也可以尝试。 (我不解释这背后的原因,但它对我有用)
这是 iOS 9.0 的错误。默认情况下,UITextView 应至少包含 10 个字符。但是您可以稍后在 viewDidLoad 方法中更改它。
参考:
当我使用 pushViewController
时,会调用 viewWillDisappear
(第一个视图控制器)。在那之后,屏幕冻结,因此没有执行任何操作,我将断点放在 nextviewcontroller
上,它不会在 viewDidLoad
方法中调用。
//first View Controller from where pushViewController
[[AppCommonFunctions sharedInstance]pushVCOfClass:[NextViewController class] fromNC:[self navigationController] animated:YES popFirstToVCOfClass:nil modifyVC: ^(id info) {
[((NextViewController *)info)setEventInfo : object];
}];
//common method for push view controller in another file
- (void)pushVCOfClass:(Class)class1 fromNC:(UINavigationController *)nc animated:(BOOL)animated popFirstToVCOfClass:(Class)class2 modifyVC:(operationACFFinishedBlock)modify {
RESIGN_KEYBOARD
[self popToViewControllerOfKind : class2 from : nc];
UIViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:[class1 description]];
if (modify) {
modify(vc);
modify = nil;
}
[nc pushViewController:vc animated:animated];
}
- (UIViewController *)popToViewControllerOfKind:(Class)aClass from:(UINavigationController *)navController {
RESIGN_KEYBOARD
if (aClass) {
NSArray *arrayOfViewControllersInStack = navController.viewControllers;
for (int i = 0; i < arrayOfViewControllersInStack.count; i++) {
if ([[arrayOfViewControllersInStack objectAtIndex:i] isKindOfClass:aClass]) {
int index = (i > 0) ? (i - 1) : i;
[navController popToViewController:[arrayOfViewControllersInStack objectAtIndex:index] animated:NO];
break;
}
}
return [navController topViewController];
}
return nil;
}
我也遇到这个问题。我发现 CPU 使用率在 pushViewController:animated:
之后是 100%,并且 运行 循环卡住了。视图控制器无法加载 loadView
中的视图。
loadView
进程可能在 iOS 9 中被内部更改,或者 storyboard/xib 文件由于 Xcode 7 而被错误构造(可能只是一个错误)。
第一步,尝试在推送前加载视图
我尝试打印 view
属性 以强制视图控制器调用 loadView
。
UIViewController *vc = ...;
NSLog(@"vc.view: %@", vc.view); // Never print
[self.navigationController pushViewController:vc animated:YES];
我发现在调用 view
属性 时无法加载视图。 NSLog()
不会打印视图对象,运行 循环卡住。
第2步,加载视图时显示调用堆栈
在目标视图控制器中添加以下 loadView
实现。
- (void)loadView
{
NSLog(@"will loadView");
[super loadView];
NSLog(@"did loadView");
}
构建并 运行 您的应用程序,并尝试通过调用 属性 view
来触发 loadView
。现在您应该会发现该应用程序卡在目标视图控制器中的 [super loadView]
。
现在尝试多次暂停执行(Debug » Pause,或cmd + ctrl + Y
),您应该会发现应用程序(运行loop)几乎卡在了某些特定的方法上。在我的例子中,我的应用程序卡在 -[NSLocalizableString length]
(或 objc_msgSend
)。
我认为这是调试的提示(我的视图控制器是通过故事板构建的,故事板直接在项目中本地化)。
更新
我通过版本控制(git)将故事板文件重置为以前的版本后,应用运行良好,视图加载成功。
如果您的 NextViewController 有任何 UITextView,您必须在情节提要中提供其 默认文本值 并通过执行此操作从代码中更改其值,它对我来说很好,您也可以尝试。 (我不解释这背后的原因,但它对我有用)
这是 iOS 9.0 的错误。默认情况下,UITextView 应至少包含 10 个字符。但是您可以稍后在 viewDidLoad 方法中更改它。
参考: