每周总结:应用架构

阿伦·布雷特霍斯特,2014年6月21日

如果你在iOS世界里有过多地经验,你可能无疑听说过人们对苹果样本代码的抱怨(或者你自己也抱怨过)。别误会,偶尔有些绝对精彩的代码,比如 UIImage+ImageEffects(今天可能已经添加到 App Store 上半数应用程序中...),但这些似乎并不多见。在我看来,最大的遗漏之一是苹果没有提供如何正确管理集合视图和表格视图数据源的示例代码。坦白说,我知道你在想什么,“有什么不知道的?我创建一个带有表格视图的视图控制器,然后把数据源和代理设置为自我。很简单。”这在较简单的情况下是可以这样做的,但当开始构建更复杂的表和集合填充规则或想要重用视图控制器时,事情会变得很复杂。

传统上,为了解决这个问题,我通常会创建一个实现了 UITableViewDataSource 的 NSObject 子类,然后创建一个新的数据源对象实例,将其交给表格视图,然后继续操作。这确实很有效,但我仍然缺乏我可以依赖的最佳实践。幸运的是,今年在 WWDC 上有一个会议专门讨论了这个问题,并提供了一些指导,说明苹果工程师是如何在苹果发布的应用程序中解决这个问题。而且还有示例代码!

不用说,这个会议,WWDC 会议 232:使用集合视图的高级用户界面,是今年我参加的最好的会议之一。奥勒·贝格曼似乎也同意,他在 博客上对这次谈话做了更详细的讨论。我强烈建议观看会议视频并查看示例代码。这是促进代码重用和解开应用中更复杂关系的绝佳方式。确保你可以检查出来!

最好的祝福,
阿伦


我们正在阅读


本周控件

DZNEmptyDataSet

DZNEmptyDataSet

一个 UCLAulerView/UICollectionView 超类分类,可在视图没有内容显示时显示空数据集。

它将自动工作,只需遵守 DZNEmptyDataSetSource,并返回您想要显示的数据。当调用 -reloadData 时,会观察到空数据集配置的需要。当视图要释放时,将 dataSetSource 和 dataSetDelegate 设置为 nil 是(非常重要)。此类底层使用 KVO,因此需要在解除引用视图之前删除观察者。

MIT 许可证。

了解更多 添加到收藏  观看视频


每周汇总

RACollectionViewReorderableTripletLayout

RACollectionViewReorderableTripletLayout

可以拖动对单元格进行重新排列的自定义collectionView布局。

pod 'RACollectionViewReorderableTripletLayout'

MIT 许可证。

了解更多 添加到收藏


MZBookshelfCollectionViewLayout

MZBookshelfCollectionViewLayout

类似于iBooks的书架布局,适用于UICollectionView。

MIT 许可证。

了解更多 添加到收藏


GSIndeterminateProgressBar

GSIndeterminateProgressBar

类似于不确定进度的iOS控件

MIT 许可证。

了解更多 添加到收藏


LKAssetsLibrary

LKAssetsLibrary

LKAssetsLibrary为ALAssetsLibrary提供分组/过滤/排序功能。

MIT 许可证。

了解更多 添加到收藏


PI_EmojiPicker

PI_EmojiPicker

简化的基于NSView或NSViewController的Emoji选择器。

我基于AGEmojiKeyboard(https://github.com/ayushgoel/iOS-emoji-keyboard)的出色工作创建了一个OS X版本。

它非常简单,值得花几个小时的时间。如果您希望允许用户在不需要使用“特殊键盘”的情况下输入Emoji,它非常有用。

例如,Messages/iChat在文本输入旁边有一个表情符号选择器。

MIT 许可证。

了解更多 添加到收藏


Tattle-UI

Tattle-UI

作为开发者,我们很难理解和重现测试员报告的一些UI错误。从测试员的角度看,测试员在测试时用段落解释简单的UI错位。

Tattle-UI通过提供从测试员获得UI反馈的更简单机制来解决这个问题。

MIT 许可证。

了解更多 添加到收藏


btSimpleRippleButton

btSimpleRippleButton

这是一个具有涟漪效果的iOS自定义按钮。它简单易于集成和自定义。支持使用块调用的回调。

MIT 许可证。

了解更多 添加到收藏


HRColorPicker

HRColorPicker

RColorPicker是一个轻量级的iOS颜色选择器,对于用户和开发人员来说都很容易使用。

http://hayashi311.github.io/Color-Picker-for-iOS/

BSD许可。

了解更多 添加到收藏


AKTagsInputView

AKTagsInputView

一个方便的查找和选择输入视图,用于编写标签数据。

功能

  • 编写您自己的标签
  • 禁止使用符号设置
  • 空格或逗号分隔
  • 类似查找的辅助输入视图
  • 快速通过首字母查找

Apache 2.0许可。

了解更多 添加到收藏  观看视频


LMGeocoder

LMGeocoder

为地理编码和反向地理编码提供简单封装,使用Google Geocoding API和Apple iOS Geocoding Framework。

MIT 许可证。

了解更多 添加到收藏


Glyphish Gallery

Glyphish Gallery

以风格浏览和搜索您的Glyphish图标。

支持OS X 10.8及以上版本。

许可证未指定。

了解更多 添加到收藏


VideoCover

VideoCover

添加背景视频的简单演示

Apache 2.0许可。

了解更多 添加到收藏


RSPOPPickerSheet

RSPOPPickerSheet

全屏弹出和阻塞选择面板。

问题

在我的一些工作项目中,我需要在UITableViewController的tableView中显示一个选择视图,所以我将一个选择视图添加到tableView的子视图中。结果是这个选择视图将和tableView一起滚动。

如何解决

我们需要一个类似模态和阻止操作的控件,所以这里有UIActionSheet。我们必须自定义UIActionSheet来显示选择视图。

众所周知,UIActionSheet不能拖入空的xib,但UIView可以。所以我们从一个UIView开始,进行布局,然后更改UIView的类名为UIActionSheet。这对于基于UIView的一些控件来说效果很好。

MIT 许可证。

了解更多 添加到收藏


JPRequest

JPRequest

JPRequest是一个简单的Objective-C对象,用于从Web服务发送和接收POST和GET数据。

MIT 许可证。

了解更多 添加到收藏


UAProgressView

UAProgressView

UAProgressView是一个简单、轻量级但强大的动画圆形进度视图。

MIT 许可证。

了解更多 添加到收藏


Swift船员运算符

Swift Spaceship Operator

包含一个Swift文件,向项目中添加船员运算符(<=>

6.0 <=> 17.0 // Outputs -1

9001.0 <=> 9000.0 // Outputs 1

4.0 <=> 4.0 // Outputs 0

在iOS和OS X上工作,但Xcode项目设置为OS X命令行工具。

MIT 许可证。

了解更多 添加到收藏


INSSearchBar

INSSearchBar

动画搜索栏。

最初为ShopNow v2开发(http://www.shopnow.de)。

该搜索栏设计为一个独立组件,可以轻松拖放任何现有iOS项目中。

关于此控件的更多信息请参阅http://salanki.com/insomniac/2014/06/03/the-search-bar-experiment/

许可证未指定。

了解更多 添加到收藏


BWTitlePagerView

BWTitlePagerView

重新创建Twitter导航控制器分页器。

Apache 2.0许可。

了解更多 添加到收藏


TMConsecutiveDayHelper

TMConsecutiveDayHelper

一个相当基本的实现,有助于跟踪用户连续天数开启您的应用。

该组件使用NSUserDefaults跟踪日期。它还使用了在PMCalendar仓库中的NSDate+Helpers类别,该仓库位于https://github.com/kovpas/PMCalendar,使用MIT许可。

安装

将TMConsecutiveDayHelper.h和TMConsecutiveDayHelper.m复制到您的项目中,以及NSDate+Helpers.h和NSDate+Helpers.m。

在您的App Delegate的application didFinishLaunchingWithOptions:方法中调用:

[TMConsecutiveDayHelper appLaunched];

然后,要检查用户连续天数,可以调用:

[TMConsecutiveDayHelper streakSizeInDays]; 或者,您可以调用

[TMConsecutiveDayHelper hasComeBackForThisExactNumberOfDaysConsecutively:5],它返回一个BOOL值

目前还没有重置记录的逻辑,但添加起来非常简单。基本上,你负责你想如何使用这些信息,而类仅跟踪记录本身。

缺点

因为应用使用了NSUserDefaults,所以它很容易被用户通过更改设备日期来进行操作。组件还使用了ARC,因此如果你的项目正在使用引用计数(即保留释放),那么在你的App/Target设置中“编译源”下“TMConsecutiveDayHelper.m”行内的编译器标志“-fobjc-arc”中放置它。

MIT 许可证。

了解更多 添加到收藏


ODSAccordionView

ODSAccordionView

又一个手风琴式容器视图。

MIT 许可证。

了解更多 添加到收藏


btSimplePopUp-Menu

btSimplePopUp-Menu

这是一个简单的iOS弹出菜单。受iOS7启动板上分组文件夹(相似)的启发。它 entirely 基于UIView。包括扁平风格,使用块提供回调,以及多种选择圆角和平直角、边框弹出窗口。这个控制支持使用滚动进行分页,从而用户可以添加任意数量的菜单项到弹出菜单中。

任何选中的菜单都会在点击的项上创建涟漪效果。

易于使用,易于集成。

MIT 许可证。

了解更多 添加到收藏


BHTKeyboardAnimationBlocks

BHTKeyboardAnimationBlocks

UIViewController类别,使处理键盘出现/消失时的动画变得更加容易。提供了一种简单的基于块的API来设置在所有UIKeyboardNotifications上要执行的动画。

MIT 许可证。

了解更多 添加到收藏


MNTPullToReact

MNTPullToReact

MNTPullToReact 是著名 Pull to Refresh 交互的扩展进化。

Apache 2.0许可。

了解更多 添加到收藏


AFBlurSegue

AFBlurSegue

为模态视图控制器模糊背景的自定义 UIStoryboardSegue 实现。

MIT 许可证。

了解更多 添加到收藏