Xcode 从 7 升级到 10 后 popoverController 不显示
popoverController does not show after upgrading Xcode from 7 to 10
我有这个应用程序,它是以前在 Xcode 7 开发和维护的。
但最近我们必须将 Xcode 升级到 10 才能 post 应用程序到苹果商店。
许多布局在更新后被破坏,这似乎是一个已知问题
ref。我相信这是 AutoLayout 问题。我通过转到故事板添加所需的约束来修复它们。
但是我不知道如何修复其中一个 popovercontroll 的问题。
它应该是这样的:
这是升级后的样子:
弹出窗口未显示。
密码没有改变。它是继承自 UITableViewController
的自定义 table 视图控制器。我尝试更新框架,但没有用。
应弹出视图的代码:
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
UNISortTableViewController *contentViewController = [storyBoard instantiateViewControllerWithIdentifier:@"UNISortTableViewController"];
((UNISortTableViewController *)contentViewController).sortKeyArray = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", nil];
[(UNISortTableViewController *)contentViewController setPreviousSortKeyIndex:sortKeyIndex];
[(UNISortTableViewController *)contentViewController setPreviousSortOrder:ascIssues];
self.popoverController = [[popoverClass alloc] initWithContentViewController:contentViewController];
if ([self.popoverController respondsToSelector:@selector(setContainerViewProperties:)]) {
[self.popoverController setContainerViewProperties:[self improvedContainerViewProperties]];
}
self.popoverController.delegate = self;
contentViewController.delegate = self;
[self.popoverController presentPopoverFromBarButtonItem:sender
permittedArrowDirections:(UIPopoverArrowDirectionUp|UIPopoverArrowDirectionDown|
UIPopoverArrowDirectionLeft|UIPopoverArrowDirectionRight)
animated:YES];
调试时我可以看到 cellforrowatindexpath
事件没有被调用
您的过时代码正在调用 initWithContentViewController
。这表明您正在使用 UIPopoverController,它在 iOS 9.
之后被弃用
您需要使您的弹出窗口方法现代化。如今,弹出窗口只是各种呈现的视图控制器。不再有 UIPopoverController 这样的东西了。您只需在 modalPresentationStyle
为 UIModalPresentationPopover
的普通 UIViewController 上调用 presentViewController
。您指定箭头所在位置的整个方式也发生了变化,但我不会详细介绍,因为完整信息可在文档和其他地方找到。
好像 Xcode 10 popoverContentSize
变成了 0,0
我最终使用了以下代码
if (!([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad))
{
self.popoverController.popoverContentSize = contentViewController.preferredContentSize;
}
我有这个应用程序,它是以前在 Xcode 7 开发和维护的。 但最近我们必须将 Xcode 升级到 10 才能 post 应用程序到苹果商店。
许多布局在更新后被破坏,这似乎是一个已知问题 ref。我相信这是 AutoLayout 问题。我通过转到故事板添加所需的约束来修复它们。
但是我不知道如何修复其中一个 popovercontroll 的问题。
它应该是这样的:
这是升级后的样子:
弹出窗口未显示。
密码没有改变。它是继承自 UITableViewController
的自定义 table 视图控制器。我尝试更新框架,但没有用。
应弹出视图的代码:
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
UNISortTableViewController *contentViewController = [storyBoard instantiateViewControllerWithIdentifier:@"UNISortTableViewController"];
((UNISortTableViewController *)contentViewController).sortKeyArray = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", nil];
[(UNISortTableViewController *)contentViewController setPreviousSortKeyIndex:sortKeyIndex];
[(UNISortTableViewController *)contentViewController setPreviousSortOrder:ascIssues];
self.popoverController = [[popoverClass alloc] initWithContentViewController:contentViewController];
if ([self.popoverController respondsToSelector:@selector(setContainerViewProperties:)]) {
[self.popoverController setContainerViewProperties:[self improvedContainerViewProperties]];
}
self.popoverController.delegate = self;
contentViewController.delegate = self;
[self.popoverController presentPopoverFromBarButtonItem:sender
permittedArrowDirections:(UIPopoverArrowDirectionUp|UIPopoverArrowDirectionDown|
UIPopoverArrowDirectionLeft|UIPopoverArrowDirectionRight)
animated:YES];
调试时我可以看到 cellforrowatindexpath
事件没有被调用
您的过时代码正在调用 initWithContentViewController
。这表明您正在使用 UIPopoverController,它在 iOS 9.
您需要使您的弹出窗口方法现代化。如今,弹出窗口只是各种呈现的视图控制器。不再有 UIPopoverController 这样的东西了。您只需在 modalPresentationStyle
为 UIModalPresentationPopover
的普通 UIViewController 上调用 presentViewController
。您指定箭头所在位置的整个方式也发生了变化,但我不会详细介绍,因为完整信息可在文档和其他地方找到。
好像 Xcode 10 popoverContentSize
变成了 0,0
我最终使用了以下代码
if (!([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad))
{
self.popoverController.popoverContentSize = contentViewController.preferredContentSize;
}