每周综述:应用架构

Aaron Brethorst, 2014年6月21日

如果你在iOS圈子里待了一段时间,毫无疑问你会听到人们抱怨(或者你自己也可能抱怨过)关于苹果示例代码的典型状态。不要误会我,偶尔你会看到一些真正的瑰宝,比如 UIImage+ImageEffects(这可能是今天App Store上一半的应用都添加过的功能...),但这些实在是太少见了。在我看来,最大的遗漏之一就是苹果没有提供如何正确管理集合视图和表格视图数据源的示例代码。是的,我知道你在想什么,“有什么不知道的?我创建了一个拥有表格视图的视图控制器,然后只是将数据源和代理设置为self,很简单。” 对于更简单的情况,这样做是合理的,但是当你要建立更复杂的填充表格和集合的规则时,或者当你想要重用视图控制器时,事情会变得非常复杂。

传统上,为了解决这个问题,我总是会创建一个实现 UITableViewDataSource 的 NSObject 子类,然后创建一个新的数据源实例,将其传递给表格视图,然后继续。而且这确实非常有效,但我仍然缺乏可以信赖的最佳实践。幸运的是,今年在WWDC上有一个会议正是针对这个问题,提供了有关苹果工程师如何在苹果产品中解决这个问题的指导。而且还有示例代码!

不用说,这个会议,WWDC会议232:使用集合视图的先进用户界面,是我今年参加的最好的会议之一。Ole Begemann看起来也同意,并且在博客上更详细地介绍了这个演讲。我强烈推荐观看会议视频和查看示例代码。这是一个促进代码重用并解开你应用程序中更复杂关系的绝佳方式。一定要查查它!

最好的祝愿,
Aaron


我们正在阅读的内容


本周控件的掌控

DZNEmptyDataSet

DZNEmptyDataSet

一个可以显示空的表格视图/集合视图数据集的上层分类,当视图没有内容要显示时。

它将自动工作,只需符合 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的简单表情选择器。

我以AGEmojiKeyboard(https://github.com/ayushgoel/iOS-emoji-keyboard)的优秀作品为基础创建了一个OS X版本。

它非常简单,只需几个小时的工作即可实现。如果想让用户在编辑菜单中不必使用“特殊键盘”就能输入表情符号,那么它很有用。

例如,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框架。

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。

调用以下方法

[TMConsecutiveDayHelper appLaunched];

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

然后,要检查用户的连续登陆天数,您可以调用

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

[TMConsecutiveDayHelper hasComeBackForThisExactNumberOfDaysConsecutively:5],它会返回一个 BOOL 类型的值

目前还没有重置连续登陆天数的逻辑,但这可以很容易地添加。基本上,您负责您想要如何使用这些信息,类只是跟踪连续登陆天数本身。

缺点

因为这个应用使用了 NSUserDefaults,所以很容易被用户通过在设备上更改日期来作弊。该组件还使用 ARC,如果你的项目使用引用计数(即保留/释放),那么请将编译器标志 ' -fobjc-arc ' 放在 TMConsecutiveDayHelper.m 中 '编译源代码' 下的 '编译阶段' 标签内,位于你的 App/Target 设置中。

MIT许可证。

了解更多 加入收藏


ODSAccordionView

ODSAccordionView

另一个折叠式容器视图。

MIT许可证。

了解更多 加入收藏


btSimplePopUp-Menu

btSimplePopUp-Menu

这是一个简单的 iOS 弹出菜单。灵感来自 iOS7 春扳上的分组文件夹(外观相似)。它完全基于 UIView。包括扁平外观、使用 block 的回调以及多种曲线或平直角度的选项、带边框的弹出菜单。这个控件支持滚动翻页,因此用户可以将多个菜单项添加到弹出菜单中。

选中任何菜单都会在点击的项目上产生涟漪效果。

易于使用,便于集成。

MIT许可证。

了解更多 加入收藏


BHTKeyboardAnimationBlocks

BHTKeyboardAnimationBlocks

UIViewController 分类简化了处理键盘出现/消失时动画的难度。提供基于 block 的简单 API 来设置每个 UIKeyboardNotification 应该执行的动画。

MIT许可证。

了解更多 加入收藏


MNTPullToReact

MNTPullToReact

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

Apache 2.0授权。

了解更多 加入收藏


AFBlurSegue

AFBlurSegue

为模态视图控制器实现自定义的 ServletException,用于模糊背景。

MIT许可证。

了解更多 加入收藏