测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可 | MIT |
发布最后发布 | 2014年12月 |
由Jake Marsh维护。
UITableViewController
的子类,允许您轻松简单地展示我所称的“静态内容”。iOS 内置的设置应用中的内容就是一个例子。或者一个简单的“关于”页面。或者一个“登录”页面。或者是任何显示或收集信息的多屏幕。
所有这些都可以通过一些非常酷的方法实现,这些方法使用 blocks。它还允许您轻松创建收集信息的 UITableViewControllers
。
这个库正在制作中。虽然它的功能已经相当强大且可用,但如果您继续阅读,会发现还有很多可以改进的地方,我非常乐意听听大家的想法和如何将这个库适应每个人的需求。
话虽如此,JMStaticContentTableViewController
可能并不适合每个人,但如果你曾经完整实现过 UITableView
的 UITableViewDataSource
和 UITableViewDelegate
方法,那么你很可能了解这个库可以为您节省多少时间。
继续阅读,会有更多精彩内容。
您需要使用支持自动引用计数的编译器来构建使用 JMStaticContentTableViewController
的项目。您的项目可以使用非 ARC 编译器来使用此库。详情请 参阅此处
值得注意的是,JMStaticContentTableViewController
支持 iOS 5 和更高版本。
以下是一个在您的 UITableView
中添加一个分区和单元格的简单示例。您可能会在您的 JMStaticContentTableViewController
子类的 viewDidLoad
方法内部编写此代码。
请注意,您传入了一些非常重要的对象,JMStaticContentTableViewSection
,JMStaticContentTableViewCell
和一个 UITableViewCell
。您可以像通常一样配置 UITableViewCell
。我们还使用 JMStaticContentTableViewCell
对象来设置如 UITableViewCellStyle
和复用标识符。
JMStaticContentTableViewSection
还允许您设置分区标题等。
如你所见,我们还获得了一个非常棒的 whenSelected:
block,这允许编写在单元格被点击时将运行的代码,这是一个很好的例子,例如,在 UIViewController
中推送。
- (void) viewDidLoad {
[super viewDidLoad];
[self addSection:^(JMStaticContentTableViewSection *section, NSUInteger sectionIndex) {
[section addCell:^(JMStaticContentTableViewCell *staticContentCell, UITableViewCell *cell, NSIndexPath *indexPath) {
staticContentCell.cellStyle = UITableViewCellStyleValue1;
staticContentCell.reuseIdentifier = @"DetailTextCell";
cell.textLabel.text = NSLocalizedString(@"Wi-Fi", @"Wi-Fi");
cell.detailTextLabel.text = NSLocalizedString(@"T.A.R.D.I.S.", @"T.A.R.D.I.S.");
} whenSelected:^(NSIndexPath *indexPath) {
[self.navigationController pushViewController:[[WifiViewController alloc] init] animated:YES];
}];
}];
}
这将与上面的addCell:
功能类似,只不过它会以动画效果完美地进入位置。
- (void) _someTaskFinished {
[self insertCell:^(JMStaticContentTableViewCell *staticContentCell, UITableViewCell *cell, NSIndexPath *indexPath) {
staticContentCell.reuseIdentifier = @"WifiNetworkCell";
staticContentCell.tableViewCellSubclass = [WifiNetworkTableViewCell class];
cell.textLabel.text = network.networkName;
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
cell.indentationLevel = 2;
cell.indentationWidth = 10.0;
} whenSelected:^(NSIndexPath *indexPath) {
// TODO
} atIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:YES];
}
与上面的示例相同,但这里是我们在调用beginUpdates
和endUpdates
的同时执行我们的工作,同样保留了所有UITableView
的内置“魔法”,同时也使用了方便的语法。
// Somewhere else you'd probably load some data somehow,
// then want to insert rows for the new items in that data.
// Normal table view functionality is completely retained, for example,
// here we're inserting a bunch of cells inside a beginUpdates/endUpdates block
// so all our new cells will animate in simultaneously and look awesome.
[self.tableView beginUpdates];
for(SomeModelObject *o in self.awesomeModelObjects) {
[self insertCell:^(JMStaticContentTableViewCell *staticContentCell, UITableViewCell *cell, NSIndexPath *indexPath) {
staticContentCell.reuseIdentifier = @"SomeCell";
cell.textLabel.text
} atIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:YES];
}
[self.tableView endUpdates];
每次你请求JMStaticContentTableViewController
动画插入或删除单元格或区域时,它会在底层使用UITableViewRowAnimation
样式的UITableViewRowAnimationAutomatic
,因此所有动画都会看起来很棒。这个样式是在iOS 5中添加的。
为了好玩(并帮助我在开发库时确定其需求),我开始使用JMStaticTableViewController
来尝试重新创建内置的iOS设置应用。这个应用处于一个“半成品”状态,存放在这个仓库中。
你可以尝试以下功能
Wi-Fi,进入Wi-Fi部分,注意在“搜索网络”后(这显然是模拟的)行会显示出来。也尝试禁用和重新启用Wi-Fi。注意行是如何正确地显示和消失的。
通知部分也展示了内容展示。
不应该“可选择”的单元格(如包含UISwitch
控件的单元格)是不可选择的。
正常的UITableViewDelegate
方法仍然有效,因此实现像在标题旁边添加UIActivityIndicatorView
这样的功能与之前没有更复杂或更简单。
如我所述,它还未完成,主要是作为你检查和了解库如何在“现实世界”中使用的一个工具。欢迎更多完成示例以及任何其他示例,请随时提交拉取请求。
《JMStaticContentTableViewController》支持iOS 5及以上版本。
下载源文件或将它作为一个 git 子模块添加。以下是将其作为子模块添加的方式:
$ cd YourProject
$ git submodule add https://github.com/jakemarsh/JMStaticContentTableViewController.git Vendor/JMStaticContentTableViewController
将“JMStaticContentTableViewController”文件夹内的所有文件添加到您的项目中。
《JMStaticContentTableViewController》使用 自动引用计数(ARC)。您也应该使用ARC,这是未来的方向。如果您的项目不使用ARC,您需要在所有《JMStaticContentTableViewController》源文件上设置编译器标志-fobjc-arc
。要在Xcode中这样做,请转到活动目标并选择“构建设置”标签。在“编译器标志”列中,为《JMStaticContentTableViewController》的每个源文件设置-fobjc-arc
。
这是我为了这个目的第一次尝试构建这样的系统,我已经计划要做很多事情,比如修正、改进和重构。如果我工作完成后对自己的代码没有一点恨意,那就不是好开发者了? :)
我非常欢迎建议/修正/仇恨信件等,只需在拉取请求、问题报告甚至在推特上告诉我,我是 @jakemarsh。
话虽如此,这是一个极具主观性的库。它做出了可能不适用于所有人的代码库或应用的假设和定义了公约。如果你是这些人群中的一员,请随时提交拉取请求,这样我们可以讨论它,也许可以让你的一些期望的改变得到实现。