表视图控制器在弹出窗口中分配给 contentViewController 属性时不显示数据

Posted

技术标签:

【中文标题】表视图控制器在弹出窗口中分配给 contentViewController 属性时不显示数据【英文标题】:Table view controller not showing data when assigned to contentViewController property in popup 【发布时间】:2014-06-25 14:15:34 【问题描述】:

我有一个从按钮出现的弹出框,里面有一个表格视图控制器和表格视图。我为表格视图创建了一个单独的数据源。故事板中的所有内容都已连接:

我在应用程序的主视图控制器中保留对表视图控制器的引用(在弹出框被解除后执行工作)。我想将选择保留在弹出框内的表格视图中。这是我在主视图控制器中的 -prepareForSegue:sender: 方法:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([[segue identifier] isEqualToString:@"Popover"]) 
        UIStoryboardPopoverSegue *popover = (UIStoryboardPopoverSegue *)segue;
        popover.popoverController.delegate = self;
        popover.popoverController.contentViewController = (AJFTableViewController *)self.filterTableViewController;
    

我的问题是这样的:当我将弹出窗口的 contentViewController 分配给应用程序的主视图控制器引用的表视图控制器(上述方法的最后一行)时,表视图中不会出现任何数据。我已经确认正在创建数据源,甚至尝试在该方法结束时手动调用 tableView 上的 reloadData,但仍然没有出现。

如果我注释掉最后一行(将弹出框 contentViewController 分配给表格视图控制器属性),我会在表格视图中看到数据。但是,每次弹出窗口出现时都会创建一个新的表格视图控制器,这不是我想要的。

如何正确地将弹出框的 contentViewController 分配给我在应用程序的主视图控制器中持有的表格视图控制器,以便在弹出框出现时显示数据?

【问题讨论】:

【参考方案1】:

您将无法使用 segue 来执行此操作,因为 segue 总是会实例化新的控制器。如果你想重用内容控制器的同一个实例,那么你需要用类似这样的代码来呈现它,

@interface ViewController ()
@property (strong,nonatomic) AJFTableViewController *filterTableViewController;
@property (strong,nonatomic) UIPopoverController *popController;
@end

@implementation ViewController


- (IBAction)showPopover:(UIButton *)sender 
    if (! self.filterTableViewController) 
        self.filterTableViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Table"];
    
    self.popController = [[UIPopoverController alloc] initWithContentViewController:self.filterTableViewController];
    self.popController.delegate = self;
    [self.popController presentPopoverFromRect:sender.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

【讨论】:

谢谢,我不知道序列总是实例化新的控制器。

以上是关于表视图控制器在弹出窗口中分配给 contentViewController 属性时不显示数据的主要内容,如果未能解决你的问题,请参考以下文章

iOS 在弹出窗口中显示视图控制器

在弹出窗口中呈现模态视图

在哪里设置弹出窗口中显示的视图控制器的大小?

在弹出窗口中显示多个图像

AppKit 上的 SwiftUI - 在弹出窗口中将焦点设置为 TextField

在 Combine 的 `assign(to:on:)` 主题中分配给 @State 不会导致视图更新