【问题标题】:Refreshing Master TableView of a UISplitView Controller刷新 UISplitView 控制器的主 TableView
【发布时间】:2011-12-25 08:03:58
【问题描述】:

在将我们最新的 iPhone 应用程序移植到通用应用程序时,我决定在 TabBarController 中使用 iPad 的 SplitView 控制器。 SplitViewController 由 AppDelegate 为每个 Tab 管理。

一切正常,但我的问题是我的 MasterView(在 SplitView 的左侧)包含 4 个类别按钮来更改 TableViews 数据。如果我单击其中一个按钮,TableView 需要刷新/重新加载数据,以显示所选类别的新内容。 我创建了一个函数来进行更改并在界面构建器中将我的按钮链接到它。

在我的函数结束时,我尝试像这样刷新控制器:

[self tableView ReloadData];

但 SplitView 不显示刷新。仍然是旧数据。 我用 NSLog 进行了一些测试,以检查我的功能是否正常工作。没问题。

然后我尝试通过SplitViewController本身访问tableView,像这样:

   // PresetController is my TableViewController in the SplitView  
    UISplitViewController *split = (UISplitViewController *)self.parentViewController;    
    PresetController *detail = [split.viewControllers objectAtIndex:0];   

    [detail.tableView reloadData];

再次,没有错误,.. 但没有刷新。

我错过了什么吗?有什么方法可以轻松地在 SplitView 中重新加载 TableViewController?我已经阅读了有关通过 NotificationCenter 向代表发送通知的内容,但仍然找不到有用的资源。

编辑:

为了理解我的结构,这里是我在 AppDelegates "didFinishLaunchingWithOptions" 方法中设置 SplitView 的方式:

NSMutableArray *controllers = [NSMutableArray arrayWithCapacity:[self.rootController.viewControllers count]];

        int tabNum = 0;
        for (UIViewController *controller in self.rootController.viewControllers) {



                UISplitViewController *split = [[[UISplitViewController alloc] init] autorelease];
                split.tabBarItem = controller.tabBarItem;
                iPadDetailView *detail = [[iPadDetailView alloc] initWithNibName:@"iPadDetailView" bundle:nil]; // a detail view will come here
                UINavigationController *nav = [[[UINavigationController alloc] initWithRootViewController:detail] autorelease];

                split.viewControllers = [NSArray arrayWithObjects:controller, nav, nil];


                [controllers addObject:split];
            }
            tabNum++;

【问题讨论】:

    标签: objective-c ios ipad uisplitviewcontroller universal


    【解决方案1】:

    试试:

    PresetController *detail = [split.viewControllers lastObject];
    

    索引 0 处的视图控制器将是您的“主”控制器,我认为“详细”控制器是您尝试更新的表视图的控制器。

    编辑:

    您不想在标签视图中使用UISplitViewController;它必须是rootViewController

    【讨论】:

    • 嘿,保罗,谢谢您的回答。我以这种方式尝试过,收到此错误:*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[UINavigationController tableView]:无法识别的选择器已发送到实例 0x8abdc20”。似乎我只得到了导航控制器,但没有得到我的 TableView 所在的 MasterView。
    • 如果你有一个导航控制器,那么你可以向它询问它的视图控制器(topViewController)。
    • 如果我要视图控制器,我会得到一个 UILayoutContainerView。我编辑了我的第一篇文章,向您展示了我如何在 AppDelegate 中设置 SplitView。
    • 当然,在调试中检查导航控制器的视图控制器;是否有可能因为您的 rootViewController 设置不起作用而使用 UILayoutContainerView(听起来不像视图控制器)?
    • 似乎在我选择的选项卡的视图中,我有 UILayoutContainerView,它包含 PresetController(左侧)和 Navigationcontroller(右侧)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多