一个窗口中的多个视图

Posted

技术标签:

【中文标题】一个窗口中的多个视图【英文标题】:Multiple Views in one Window 【发布时间】:2009-10-18 17:24:43 【问题描述】:

我正在编写一个基于视图的应用程序,但我对加载我的视图有点困惑。我想在同一个窗口中同时加载四个不同的视图。我似乎无法弄清楚如何做到这一点。如果可能的话,我宁愿以编程方式完成所有事情,而不是使用界面构建器。

我的 4 个视图是:一个 UIView、一个 UIWebView、一个 UITableView 和另一个带有按钮的 UIView。

提前感谢您的帮助。

【问题讨论】:

你能更详细地描述一下这些是如何排列的吗?这是全屏吗?也许张贴您正在尝试做的事情的草图? 当然。它基本上是一个视图同时堆叠在一个屏幕上的另一个视图上。每个都占据屏幕的一部分。不知道如何发布草图,抱歉。 想出了如何发布图片,但我没有足够的代表点将其放入问题中。这是一个链接:picasaweb.google.com/lh/photo/… 【参考方案1】:

iPhone 应用程序中的视图是分层排列的——也就是说,每个视图都有一个“父”视图(根视图除外)。这里有趣的是 UIWindow 本身就是 UIView 的子类,所以你可以直接将所有四个视图添加到你的窗口中。 (这可能不是最好的方法,但它可能是最简单的。)

您真正需要做的就是使用您希望它们在 UIWindow 中的位置和尺寸以编程方式初始化四个视图中的每一个。为此,您可以在 init 方法中或之后(取决于视图的类型)为每个视图提供一个 frame 参数。因此,例如,在您的应用委托中,您可以添加以下代码:

CGRect frame = CGRectMake(0.0, 0.0, 100.0, 100.0);
UIView *view = [[[UIView alloc] initWithFrame:frame] autorelease];
[window addSubview:view];

这将创建一个 100x100 像素的视图并将其添加到窗口的左上角。您可以对其他三个视图中的每一个执行类似的操作。

请注意,开发人员通常不会直接在应用程序委托中初始化视图 - 更好的方法可能是让第五个视图作为其他四个视图的根视图,然后将该根视图添加到窗口中。您可以为第五个视图使用视图控制器来简化此任务 - 将视图初始化代码移动到该视图控制器的实现中,然后从应用委托中实例化视图控制器并让它从那里接管。

【讨论】:

太棒了,谢谢!那行得通。我注意到我必须把所有东西都调低,否则它会被切断。我猜这是因为标题栏。 如果你创建一个 UIView 子类来封装这些东西,它的 layoutSubviews 方法将是做定位工作的地方。每当视图的尺寸发生变化等时都会调用它。 @Adam:是的,标题栏占据了 20px 并覆盖了窗口。这是使用新 UIView 作为根而不是窗口本身的方便之处之一 - 您可以使用 (0,0) 作为可见坐标原点,而不是 (0,20)。 @Tim:我正在记下您的笔记并将视图放入一个视图控制器中。我现在的问题是如何从视图控制器访问窗口?如果我这样做 [super window] 我会收到警告,所以我猜这是错误的方法。 @Adam:你真的需要吗?理想情况下,您要做的是:在应用程序委托中创建具有视图层次结构的视图控制器,将视图控制器的视图添加到委托中的窗口,然后所有视图控制器的视图将只处理控制器中的其他视图(包括“根”视图),而不是窗口。【参考方案2】:

您可以使用[self parentViewController] 来访问父 UIView

【讨论】:

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

iPhone 开发 - 一个窗口中的多个视图。

一个窗口中跨多个视图控制器的 Cocoa 绑定

具有多个视图的 WPF 桌面应用程序

专注于一个窗口形式的多个列表视图

视图(简介,创建,查看,修改,更新,删除)

在多个窗口上处理视图 - 第二个窗口关闭时 removeFromSuperView 的问题