UIScrollview显示由核心数据属性组成的自定义UIView:用于设计的逻辑?

时间:2011-06-26 14:23:35

标签: iphone ios core-data custom-view

你能告诉我我的逻辑是否合理吗?因为我对iOS仍然很新(大概持续一周)并且非常感谢您的反馈,然后走错了方向。

我的核心数据设置是照片实体。而我正在尝试做的是在我的UIScrollView中创建一个类似对象的“记录卡”。记录卡的顶部有一个UILabel,中间是UIImage,图像下面是两个UIButtons(即按钮将是'send'或'cancel')。我的目标是让这些类似音符卡的对象像图片一样可滚动,包括页面翻转器。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

您可以像创建任何其他视图一样创建自定义XIB和UIViewController-descendant类,并在您的scrollview中重复使用它。这样可以避免手动布局子视图,并允许您封装要显示的格式化字符串周围的任何逻辑。使用此方法,自定义notecard视图将在独立时或作为其他内容的子视图(如scrollview)中工作,并为用户提供一致的界面。

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

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

您采取的任一路径,在当前SDK(< 5)中,子视图都不会参与通常的视图生命周期(viewDidLoad,viewDidUnload等)。只有主视图控制器(使用push / popViewController,presentModalViewController显示的那个)具有调用的那些方法,所以如果您的子视图具有在其中一个生命周期方法中执行的代码(并且它们可能会),您将必须创建自己的管道通知子视图发生了什么。由于SDK 5仍然在NDA下,我不能说那里有什么不同,但我可以说如果你的应用可以等待5,你的生活会更容易。看看5中的新内容,你就会知道我在说什么。

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

  • 为每个“视图”创建一个FetchRequest
  • 将获取请求的batchSize设置为屏幕大小的2.5倍(对我来说效果很好的任意值)
  • 始终为我的实体创建custom NSManagedObjects (shameless plug)。它使实体的工作更容易,因为它提供了属性名称的自动完成,实际上比getValueForKey more performant :(根据苹果)
  • 如果每个实体都有大量数据,我会尝试使用setReturnsObjectsAsFaults来查看延迟重载数据的负载是否有助于提高内存的性能
  • 如果我只需要每个实体的几个属性,我会重构我的实体,以便在列表视图中只有我需要的属性的“标题”实体,以及包含所有数据的“完整”实体(引用)在标题中,以便于加载详细视图)
  • 如果我只需要每个实体的一个属性,例如为了获得在日历中显示指示符的约会的唯一日期列表,我使用propertiesToFetch combined with NSDictionaryResultsType只返回这些值的数组< / LI>