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.

之后被弃用

https://developer.apple.com/documentation/uikit/uipopovercontroller/1624669-initwithcontentviewcontroller?language=objc

您需要使您的弹出窗口方法现代化。如今,弹出窗口只是各种呈现的视图控制器。不再有 UIPopoverController 这样的东西了。您只需在 modalPresentationStyleUIModalPresentationPopover 的普通 UIViewController 上调用 presentViewController。您指定箭头所在位置的整个方式也发生了变化,但我不会详细介绍,因为完整信息可在文档和其他地方找到。

好像 Xcode 10 popoverContentSize 变成了 0,0

我最终使用了以下代码

  if (!([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad))
{
    self.popoverController.popoverContentSize = contentViewController.preferredContentSize;
}