iPad UISplitViewController 多个根视图

Posted

技术标签:

【中文标题】iPad UISplitViewController 多个根视图【英文标题】:iPad UISplitViewController multiple root views 【发布时间】:2010-09-28 14:02:55 【问题描述】:

我正在为 iPad 开发,并使用 Xcode 中提供的模板创建了一个标准 UISplitViewController 应用程序 - 左侧是标准 UITableView,右侧是详细视图。

我已经修改了模板,这样当用户从左侧视图中选择一个表格单元格时,它会在它的位置推送一个新的表格视图(仍然在左侧)。这没有问题,但我希望能够从新的表格视图更新现有的详细视图 - 有点像 Apple 的邮件应用程序的工作方式。

- 我不想在详细视图(右侧)上创建多个视图 - 我已阅读文档并查看 Apple 提供的示例代码。

我阅读/遵循了许多教程,但似乎无法让这个相对简单的视图层次结构发挥作用。

更多细节:-

在 RootView didSelectTableRowAtIndexPath 委托方法中使用 detailViewController.detailItem = @"Test"; 会更新 Detail 视图标签。在新推送的表格视图中使用完全相同的代码不会更新标签 - 我是否缺少参考点或其他什么??

自发布以来,我尝试使用协议和委托来更新详细视图上的标签。使用新方法从根视图更改标签时,标签会正确更新,但是,当我将新视图推送到根视图(左侧)时,我无法再更新标签。

【问题讨论】:

【参考方案1】:

在创建 RootViewController(或者甚至在自定义 init 方法中)之后的某个时间点,您正在为 DetailViewController 设置委托,这是一个常见的错误,即当您将新的 rootViewController 推送到 NavController 时您忘记设置委托再次。

您可能正在以下位置创建一个新控制器:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

在将新控制器推送到导航控制器之前,方法和记录/增加新控制器的级别。创建此新控制器后,再次设置委托。

newRootController.myDelegate = self.myDelegate;

在你这样做之前如果你在使用它之前对委托进行 NSLog,你可能会发现它的 nil。

【讨论】:

非常感谢,工作的魅力!推送新视图时我已经设置了委托,但我正在创建一个新实例而不是引用现有委托。再次感谢!【参考方案2】:

试试你的 UISplitViewController 的 viewControllers 属性

@property(非原子,复制) NSArray

*viewControllers Discussion 该属性中的数组必须包含 两个视图控制器。风景 提出了控制器 在拆分视图中从左到右 横屏时的界面 方向。因此,视图控制器 在索引 0 处显示在左侧 侧面和索引处的视图控制器 1 显示在右侧 界面。

这里的第一个视图控制器 数组通常是隐藏的,当 设备处于纵向。 将委托对象分配给 接收器,如果你想协调 此视图控制器的显示使用 弹出框。

【讨论】:

据我所知,UISplitViewController 的 viewControllers 属性用于将视图控制器分配给视图(!)。我认为我的问题与授权或协议有关。无论我尝试什么,我似乎都无法让它工作......还有其他建议吗?【参考方案3】:

请注意detailViewController!您必须将此实例变量传递给新的根视图。所以是这样的:

newRootViewController.detailViewController = self.detailViewController

否则你的新根视图永远不会知道 detailView。对于您的新根(表)视图,您必须执行以下操作:

#import <UIKit/UIKit.h>
@class DetailViewController;

    @interface VorhersageTable : UIViewController 
        UITableView *vorhersageTableView;
        DetailViewController *detailViewController;
    
    @property (nonatomic, retain) IBOutlet UITableView *vorhersageTableView;
    @property (nonatomic, retain) DetailViewController *detailViewController;
    @end

在新类中声明 detailViewController 的属性。

【讨论】:

【参考方案4】:

在您推送第二个表(例如 SubRoot)之前,将其添加到您的 RootViewController.didselectRow 中

SubRoot *subController = [[SubRoot alloc] initWithNibName:@"SubRoot" bundle:nil];
subController.detailViewController = self.detailViewController;

并创建类似于RootViewController的SubRoot.h和SubRoot.m。

@class DetailViewController;
@interface SubRoot : UITableViewController 
    DetailViewController *detailViewController;

@property (nonatomic, retain)  DetailViewController *detailViewController;
@end

然后合成detailViewController。

希望对你有帮助。

【讨论】:

以上是关于iPad UISplitViewController 多个根视图的主要内容,如果未能解决你的问题,请参考以下文章

不同 iPad 版本和 iPad 型号的 UI 缩放?

ipad2020屏幕多大尺寸

Ipad图标大小Ipad设置ios 5-7 29pt 1x 2x - iPad聚光灯ios 7 40 pt - iPad app ios 7 76 pt [关闭]

如何在多台 iPad 上安装 iPad 应用程序?

CSS媒体查询仅针对iPad和iPad?

iPad、iPad 2 上的边框半径问题