用于iPhone的类似Web的选项卡

问题描述:

在iPhone上实现类似Web应用程序的选项卡的最佳方法是什么?请注意下面的截图(注意“Checkin-Info-Friends”选项卡)?这些不是UIKit标准库的一部分,但最近似乎很常见。用于iPhone的类似Web的选项卡

我花了相当长的时间为iPhone开发应用程序,但没有开发像那样的控件。这里最好的办法是什么:

  • 为每个标签内容创建一个新的UIView,并立即将三个子视图添加到主视图?
  • 仅当用户点击每个选项卡时才创建新的UIViews?
  • 把所有的内容放在一个UIScrollView中,只需要在用户点击每个标签时更改页面?

也许这里有开源的控件吗?我找不到任何东西。

alt text http://www.foursquaregame.com/foursquare-game-images/foursquare-game-mobile-app.jpg

我对类似问题的方法是让所有4个(对我来说)选项卡上的意见,但释放所有,但当前选项卡以didReceiveMemoryWarning回应。 (当然,当用户选择一个新选项卡时,您必须确保创建新视图(如果它不存在)。)

我认为这是一个很好的折衷方案 - 对(在我的例子中,内存占用是最低的),然后对低内存做出响应以避免被枪杀。

+0

所以你会有一个tabviewcontroller,但4个视图,每个包括“思考咖啡”和标签(从上图)? – 2009-12-17 01:13:32

+0

在你的情况,我会有1个tabview控制器,一个基本视图与“思考咖啡”,然后3个较小的选项卡视图的屏幕下部,每个选项卡一个。 (如果选项卡视图不是全屏幕,则保存内存。) – 2009-12-17 11:50:28

+0

(尽管这个决定对我来说很简单,因为我的每个tabviews只是有一些按钮 - 所以在所有选项卡视图中使用相同的视图控制器很简单 - 逻辑只是简单的按钮操作方法。) – 2009-12-17 11:52:23

我认为最好只是在父视图或视图控制器中有三个UIView *对子视图的引用,全部初始为空,然后让子例程隐藏其他两个视图(如果它们可见并且构造和显示)或只是展示新的观点。假设没有特别的内存要求。

我认为在子视图级别上这样一个小屏幕区域的加载/卸载问题不太可能成为问题,但是如果需要加载/卸载父视图,子视图应该都会被隐藏和卸载),并且在重载时,loadView应该在启动时调用最后一段中描述的例程。

如果实际上有三个子视图中的任何一个使用了大量的内存或资源,那么我的建议就会颠倒过来,并且每个子视图和/或其背后的任何内存密集型对象都不应该隐藏起来,尽可能卸载。我认为在那里使用谷歌地图时,隐藏时需要卸载可能适用于此。

这是正确的点吗?是否有一些额外的细节我错过了?

你可以让每个选项卡成为一个真实的视图控制器与笔尖和一切。唯一的问题是,你必须转发你想要接收的标准视图控制器调用(viewWillAppear等),但它使得编码更加清晰,因为你的代码就像你对任何其他视图的编码一样(尽管对于更小的空间)。

您可以调用每个控制器的“视图”属性以获取视图,您将视图添加为您在选项卡下的容器视图的子视图。

如果所有这三个都是表格视图,那么您可能会忽略使用单个UITableViewController,它会根据所选标签更改内容。否则,我第二次KHG的评论是使用真实视图控制器来备份每个子视图。

对于标签本身,考虑继承UISegmentedControl

+0

谢谢你的回答,弗兰克。并非所有的观点都是表格,我应该提到这一点。 UISegmentedControl的好主意。 – 2009-12-17 01:11:48

+0

嗨弗兰克,我想不出如何继承UISegmentedControl并替换绘图方法,输出我自己的图像..你会有任何想法我应该重写哪种方法? – 2009-12-18 01:58:51

+1

我没有很多(好,任何)体验子类的UI元素。您可以重写'drawRect'方法,使用'[super widthForSegmentAtIndex]'获取宽度和'[super selectedSegmentIndex]'来找出哪一个要突出显示。你也可以走子视图树,并告诉任何UILabel画自己。但是我不确定你在没有记录的API拒绝领域之前能走多远。 – 2009-12-18 18:06:29