iphone - UIScrollview 显示由核心数据属性组成的自定义 UIView : Logic for designing that?

标签 iphone ios core-data custom-view

你能告诉我我的逻辑是否合理吗?因为我对 iOS 还很陌生(大约一周),在走向错误的方向之前,我非常感谢您的反馈。

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

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

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

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

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

最佳答案

您可以创建自定义 XIB 和 UIViewController 后代类,就像任何其他 View 一样,并在 ScrollView 中重用它。这使您无需手动布置 subview ,并允许您封装有关要显示的格式化字符串的任何逻辑。使用这种方法,自定义记事卡 View 可以独立工作,也可以作为其他 View (如 ScrollView )中的 subview ,并为用户提供一致的界面。

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

在这两种解决方案中,我都有一个指定的 View 初始值设定项,它将实体作为参数,以便 View 可以自行设置,以及一个可用于在渲染 View 后更改实体的属性(属性的 setter 会导致 View 在更改时进行更新和动画)

无论采用哪种路径,在当前 SDK (< 5) 中, subview 都不会参与通常的 View 生命周期(viewDidLoad、viewDidUnload 等)。只有主视图 Controller (使用 push/popViewController、presentModalViewController 显示的 View Controller )调用了这些方法,因此,如果您的 subview 具有在这些生命周期方法之一中执行的代码(它们可能会),您将必须创建自己的方法管道通知 subview 正在发生的事情。由于 SDK 5 仍处于 NDA 状态,我不能说其中有什么不同,但我可以说,如果您的应用可以等待 5,您的生活将会轻松得多。看看 5 中的新增功能,您就会知道我指的是什么。

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

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

关于iphone - UIScrollview 显示由核心数据属性组成的自定义 UIView : Logic for designing that?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6484534/

相关文章:

iphone - 以正确的方式检测 UITextField 中的退格键

iphone - 尽管有线程,但 UIActivityIndi​​catorView 未显示

iphone - 我可以在应用程序运行时以编程方式翻转 Info.plist 值吗?

ios - 拖放 UICollectionView 单元格重用问题

iOS Typhoon DI 框架替代 objective-c 中的单例

ios - 在 Swift Core Data 中设置一对多关系的问题

ios - UIScrollView 底部的 UIButtons 不起作用

ios - XCode 模拟器 CoreData 未存储 : Where to call save managed context?

swift - 通过 HTTP 发送 `NSManagedObjects`

iphone - 如何在我的方法中获取 objectAtIndex?