0

你能告诉我我的逻辑是否合理吗?因为我对 iOS 还是很陌生(大约持续一周),并且非常感谢您的反馈,然后再朝着错误的方向前进。

我有一个带有照片实体的核心数据设置。而我想要做的是在我的 UIScrollView 中创建一个类似“记事卡”的对象。记事卡顶部有一个UILabel,中间有一个UIImage,图像下方有两个UIButton(即,按钮将是“发送”或“取消”)。我的目标是让这些像卡片一样的对象像图片一样可滚动,包括翻页器。

在大多数情况下,我认为我已经处理了 ScrollView 和 Page Turner 部分。我只是不清楚创建记事卡对象的最佳方法。

我应该只创建 UIView 的子类,然后以编程方式创建记事卡实例,还是有办法为 UIView 创建 XIB 文件,以便我可以创建从类到视图的 IBOutlets?因为如果后者是可能的,我想这样做,但不知道如何使 XIB 文件接受来自 UIView 对象的出口,而不是 UIViewController。

在自定义 UIView 之外,我仍然不清楚我应该如何从核心数据库中查询这些对象,以便在加载“待定决策”窗口时我有可滚动的对象来做出决定。

在我的 UIScrollViewController 类中,在 viewDidLoad 下,您能否告诉我是否需要使用由 FetchRequests 组成的 For 循环以及随后分配初始化并使用核心数据属性设置我的 UIView 变量的代码?因为我只是不确定这听起来是否正确以及是否有更好的选择。

4

1 回答 1

1

您可以创建自定义 XIB 和 UIViewController-descendant 类,就像任何其他视图一样,并在您的滚动视图中重用它。这使您不必手动布置子视图,并允许您封装围绕格式化字符串显示的任何逻辑。使用这种方法,自定义记事卡视图可以独立使用,也可以作为其他东西(如滚动视图)的子视图,并为用户提供一致的界面。

您可以将 View 中的插座连接到您想要的任何对象 - 如果它不是 UIViewController 派生类,则可以在 XIB 中将其称为代理对象。您将代理的类设置为您的自定义类并像往常一样连接插座。但是,当您创建视图时,它会变得有点不稳定,因为您需要将该自定义类的实例(您在 XIB 中定义的代理)传递给选项字典中的NSBundle loadNibNamed 方法。它可以工作,但我通常使用前面提到的解决方案,因为它允许视图在没有任何额外代码的情况下独立正常工作。

在这两种解决方案中,我都有一个视图的指定初始化程序,它以实体作为参数,以便视图可以自行设置,以及一个可用于在呈现视图后更改实体的属性(属性导致视图在更改时更新和动画)

无论您采用哪种方式,在当前 SDK (< 5) 中,子视图都不会参与通常的视图生命周期(viewDidLoad、viewDidUnload 等)。只有主视图控制器(使用 push/popViewController,presentModalViewController 显示的那个)调用了这些方法,所以如果您的子视图有在这些生命周期方法之一中执行的代码(它们可能会),您必须创建自己的管道以通知子视图正在发生的事情。由于 SDK 5 仍处于 NDA 之下,我不能说那里有什么不同,但我可以说,如果你的应用程序可以等待 5,你的生活会容易得多。看看 5 中的新功能,您就会知道我指的是什么。

就加载数据而言,如果不了解应用程序如何加载信息、一次显示多少条记录等信息,很难推荐最佳方法。通常,您应该尽可能少地发出获取请求,而不会加载比立即显示更多的数据。在我的项目中,我通常:

  • 每个“视图” 创建一个FetchRequest
  • 将获取请求的 batchSize 设置为屏幕大小的 2.5 倍(对我来说效果很好的任意值)
  • 总是为我的实体创建自定义 NSManagedObjects(无耻插件)。它使实体的工作更容易,因为它提供了属性名称的自动完成,并且实际上比 getValueForKey高效:(根据苹果)
  • 如果每个实体中都有大量数据,我会尝试使用 setReturnsObjectsAsFaults 来查看延迟加载大量数据是否有助于内存而不是损害性能
  • 如果我只需要每个实体的几个属性,我会重构我的实体,以便在列表视图中有一个包含我需要的属性的“标题”实体,以及一个包含所有数据的“完整”实体(在标题以方便加载详细视图)
  • 如果我只需要每个实体的一个属性,例如获取约会发生的唯一日期列表以在日历中显示指标,我使用propertiesToFetch 结合 NSDictionaryResultsType来返回这些值的数组
于 2011-06-26T15:50:05.173 回答