JMStaticContentTableViewController 0.3.1

JMStaticContentTableViewController 0.3.1

测试已测试
语言语言 Obj-CObjective C
许可 MIT
发布最后发布2014年12月

Jake Marsh维护。



  • 作者
  • Jake Marsh
JMStaticTableViewController

UITableViewController 的子类,允许您轻松简单地展示我所称的“静态内容”。iOS 内置的设置应用中的内容就是一个例子。或者一个简单的“关于”页面。或者一个“登录”页面。或者是任何显示或收集信息的多屏幕。

所有这些都可以通过一些非常酷的方法实现,这些方法使用 blocks。它还允许您轻松创建收集信息的 UITableViewControllers

这个库正在制作中。虽然它的功能已经相当强大且可用,但如果您继续阅读,会发现还有很多可以改进的地方,我非常乐意听听大家的想法和如何将这个库适应每个人的需求。

话虽如此,JMStaticContentTableViewController 可能并不适合每个人,但如果你曾经完整实现过 UITableViewUITableViewDataSourceUITableViewDelegate 方法,那么你很可能了解这个库可以为您节省多少时间。

继续阅读,会有更多精彩内容。

要求

您需要使用支持自动引用计数的编译器来构建使用 JMStaticContentTableViewController 的项目。您的项目可以使用非 ARC 编译器来使用此库。详情请 参阅此处

值得注意的是,JMStaticContentTableViewController 支持 iOS 5 和更高版本。

示例使用

添加一个分区和单元格

以下是一个在您的 UITableView 中添加一个分区和单元格的简单示例。您可能会在您的 JMStaticContentTableViewController 子类的 viewDidLoad 方法内部编写此代码。

请注意,您传入了一些非常重要的对象,JMStaticContentTableViewSectionJMStaticContentTableViewCell 和一个 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];
}

运行时插入多个单元格

与上面的示例相同,但这里是我们在调用beginUpdatesendUpdates的同时执行我们的工作,同样保留了所有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”文件夹内的所有文件添加到您的项目中。

自动引用计数(ARC)

《JMStaticContentTableViewController》使用 自动引用计数(ARC)。您也应该使用ARC,这是未来的方向。如果您的项目不使用ARC,您需要在所有《JMStaticContentTableViewController》源文件上设置编译器标志-fobjc-arc。要在Xcode中这样做,请转到活动目标并选择“构建设置”标签。在“编译器标志”列中,为《JMStaticContentTableViewController》的每个源文件设置-fobjc-arc

“这个库很糟糕,你应该感到难过”

这是我为了这个目的第一次尝试构建这样的系统,我已经计划要做很多事情,比如修正、改进和重构。如果我工作完成后对自己的代码没有一点恨意,那就不是好开发者了? :)

我非常欢迎建议/修正/仇恨信件等,只需在拉取请求、问题报告甚至在推特上告诉我,我是 @jakemarsh

话虽如此,这是一个极具主观性的库。它做出了可能不适用于所有人的代码库或应用的假设和定义了公约。如果你是这些人群中的一员,请随时提交拉取请求,这样我们可以讨论它,也许可以让你的一些期望的改变得到实现。