测试已测试 | ✗ |
Lang语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2017年11月 |
SwiftSwift 版本 | 4.0 |
SPM支持 SPM | ✗ |
维护者:Marin Todorov。
依赖项 | |
RealmSwift | ~> 3 |
Kingfisher | ~> 4 |
NSString+Color | >= 0 |
这个库由 RealmSwift ( Realm 文档 ) 支持,并且自动为 iOS 应用程序提供 CMS 功能。
目录
关于 RealmContent 的视频和博客文章链接。
此存储库中的演示应用程序包含一个使用 RealmContent 的完整工作示例。以下是快速入门课程
1) 导入 RealmSwift
和 RealmContent
import RealmSwift
import RealmContent
您的应用程序通常有一个对象列表,它从 Realm 对象服务器同步
一旦您导入 RealmContent
,它将暴露两个新的模型,Realm 将将其添加到您的默认模式中。
如果您使用多个 Realm 文件,将 ContentPage
和 ContentElement
添加到所需的对象模式中。
2) 创建内容数据源
要显示应用程序中可用的内容列表,您可以使用 RealmContent 提供的 ContentListDataSource
类
let items = ContentListDataSource(style: .sectionsByTag)
使用 .plain
显示纯文本列表或使用 .sectionsByTag
显示具有节段的列表。
3) 初始化数据源
告诉数据源您将要使用哪一个 realm(如果您有多个 realm,在此处标明其中一个)。
items.loadContent(from: try! Realm())
您还可以让数据源自动告诉您的表格或集合视图,每当从 Realm 对象服务器收到更改时,都要重新加载数据。
items.updating(view: tableView)
4) 实现您的表格视图或集合视图数据源方法,就像通常那样,但使用内容数据源,如下所示
extension ViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return items.numberOfSections
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.numberOfItemsIn(section: section)
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return items.titleForSection(section: section)
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let item = items.itemAt(indexPath: indexPath)
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
cell.accessoryType = .disclosureIndicator
cell.textLabel?.text = "» \(item.title ?? "...")"
return cell
}
}
这会显示可用内容的列表。
下一步是显示屏幕上的“页面”内容,您通过显示自定义视图控制器来实现。
5) 显示内容“页面”
显示一个 ContentViewController
实例以显示内容。您可以从表格/集合视图的点击委托方法或从任意代码片段中这样做。以下是在点击表格单元格后它将如何工作的示例
extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let item = items.itemAt(indexPath: indexPath)
let vc = ContentViewController(page: item)
navigationController!.pushViewController(vc, animated: true)
}
}
所显示的视图控制器使用表格视图动态显示从给定的 ContentPage
元素中获取的内容。如果您远程更改内容,更改将在屏幕上实时反映。
这带我们来到...
您将使用两种类型的对象 ContentPage
和 ContentElement
。前者代表一篇新闻文章、博客文章、产品页面以及其他您拥有的任何内容。后者 —— 页面内的内容块,这可能是一段文本、一个标题、一个小标题、一张图片或一个链接。
您可以通过 Realm 浏览器应用创建所有这些内容,并实时更新您应用所有客户端设备上的内容。
您可以通过 Realm 浏览器或代码添加新的 ContentPage
对象
title
—— 页面标题,用于在内容列表中自动显示(可选)priority
—— 整数,用于自动排序内容(可选)mainColor
—— 标题和链接的强调色(可选)lang
—— 开发者用于按语言过滤内容(可选)tag
—— 开发者用于过滤内容并在内容列表中自动分组(可选)id
—— 开发者用于分配页面 ID(可选)elements
—— 一个有序的 ContentElements
列表当您在 Realm 浏览器中点击(元素单元格)时,您将看到内容页面的内容元素。您可以删除、添加或重新排序它们(通过拖放)。
1) 标题
从 h1
到 h4
的四个级别标题,它们获取系统标题和标题字体大小,因此它们会自动调整大小,以防您的用户使用 iOS 的可用性功能。标题将自动采用 mainColor
值(十六进制 #004433
或命名颜色 pink
)或回退到 TextContentCell.defaultTextColor
颜色值,您可以从代码中设置。
2) 文本和链接
类型为 p
的元素创建一个文本段落。
3) 图片
类型为 img
的元素从网络获取图片并在本地缓存。当图片宽度超过视图控制器的视图宽度时,图片将被缩小。
4) 链接
如果您将 url
列的值设置为有效的 URL 地址,文本或图片将变成可点击元素,并在 Safari 视图控制器或直接在 Safari 中打开目标 URL(请参阅文档以获取详细信息)。
如果链接以 app://
方案开始,则在点击时将调用您的自定义 URL 处理闭包,因此您有机会在您的应用代码中响应用户的链接点击。这里有一个快速示例
// example link: "app://cart/product/id/123"
let vc = ContentViewController(page: myContentPageObject)
vc.openCustomURL = { url in
if url.host == "cart" {
myCart.addProductWithId(url.lastPathComponent)
}
}
present(vc, animated: true)
库包括用于渲染 Markdown 内容的类。如果您使用 CocoaPods,请确保包含名为 RealmContent.Markdown
的子规范。
MarkdownViewController
是 ContentViewController
的替代品;它不是使用本地表格视图来交互式渲染所有元素,而是简单地使用全屏网页视图并将所有元素渲染为 markdown 和/或 HTML。
此方法使您能够将 HTML 从服务器推送至任何 ContentElement
并渲染您想要的任何内容。您以牺牲一些大型文档的性能和原生表格视图控制器中获得的更改动画为代价。
您可以使用 MarkdownViewController
作为您故事板中控制器的类,或者您可以手动创建一个实例并将其呈现在屏幕上
let vc = MarkdownViewController(page: myContentPageObject)
vc.openCustomURL = { customUrl in ... }
vc.usesSafariController = true
vc.customCssStyle = "h1 {color: purple;}"
present(vc, animated: true)
RealmContent 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
# to include the core library
pod "RealmContent"
# or to include markdown and core
pod "RealmContent.Core"
pod "RealmContent.Markdown"
或者,直接将源代码文件集成到您自己的项目中。
Realm 的名称和标志是 Realm Inc. 的商标。
我们