检查方法:使用 UITableView 单元格管理 UIPageViewController 页面数据
Checking approach: Managing UIPageViewController page data using UITableView cells
我实现了一个 UIPageViewController,它允许用户通过一个单独的 UITableView add/remove/delete new "pages",类似于Apple 在 iPhone 天气应用程序中实现了 Cities/Weather 位置。项目贴在下面。在这一点上没有天气或幻想 UI – 我只是想专注于下面的 UIPageViewController 管理。如果有人想知道如何使用通过 UITableView 管理的页面来实现 UIPageViewController,希望这对您有用:
https://github.com/gallaugher/PageViewControllerDemo
它似乎工作正常,但我是新手并且很不确定我是使用推荐的方法还是 "Swifty"。
现在我有:
页面ViewController [初始视图控制器]
- 将委托和数据源设置为自己
- 首先实例化 UIViewController(想象一个用于当地天气的城市ViewController,即使细节和 UI 未在此示例中添加)并设置初始值。
- 城市(天气位置)保存在 [String] 数组中:citiesArray
In CityViewController - 当点击右下角的 "Cities" 按钮(在界面生成器中创建)时,就像 Apple Weather 一样,它会打开一个 UITableView (CityListViewController).
- 为了到达这个 CityListViewController,我触发了一个直接通过界面构建器绘制的 segue,从 CityViewController 中的 "Cities" 按钮到 CityListViewController,以模态方式呈现。
- preapareForSegue 将 citiesArray 传递到目标 CityListViewController (UITableView).
CityListViewController(UITableView)
- 用户可以在 UITableView 更新 tableView 和数组中添加城市、移动、删除
- 单击 tableView 行(城市名称或 "Local Weather")触发执行转场,展开到 CityViewController,获取源 CityListViewController 并使用它将数据传回 CityViewController(例如 citiesArray = controller.citiesArray)。
- 这个 @IBAction unwind 函数调用 PageViewController 的 unwind(实际上只是将数据从 CityListViewController 中的 TableView 传递到 UIPageViewController 页面ViewController).
在页面中放松ViewController
- 抓取资源(如 CityViewController)
- 传回关键数据(例如 citiesArray = controller.citiesArray)
- 调用函数为当前页面实例化视图控制器并设置 PageControl 索引等。
Q1:
虽然这似乎有效并且我在测试期间没有设法打破它,但从 UITableView 展开到 ViewController 只是触发另一个展开到 [=43] 是一种合理的方法吗=]PageViewController,除了传递数据之外什么都没做?
Q2:
我已经通过在 PageViewController 中以编程方式构建它来实现 UIPageControl,但是在CityViewController 使用 Interface Builder。这是正确的方法吗?我似乎无法在同一个 VC.
中创建这两个
非常感谢那些耐心看完这个令人费解的解释的人。仍在尝试处理 VC 之间传递的数据,以及这与 PageControllers 和 TableViews 的关系。
因为对解决方案感兴趣,我已将其发布到 GitHub,网址为:
https://github.com/gallaugher/PageViewControllerDemo
我发布了更通用的名称——PageVewController、DetailViewController 和 ListViewController,因此更容易重用,也许可以遵循。
感谢 Sazan Dauti 在 Whosebug 之外回答这个问题。可以直接在 PageController 和包含用于管理页面的 TableView 和类似页面数组的 ListController 之间进行 segue(例如,就像 Apple 在天气应用程序中所做的那样,您可以在其中 add/delete/move 个城市),保留详细信息(城市在原始示例)不知道它在 PageView 中。
- 将 segue 直接从 UIPageViewController 拖到 UIViewController 和 TableView,在我的例子中,包含位置列表(不是由 PageView 管理的详细信息)。 segue 应该以模态呈现。关键变量应该传递给 ListViewController 以准备在 PageViewController 中进行 segue,如下所示:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "ToListViewController" {
let controller = segue.destination as! ListViewController
controller.listArray = listArray
controller.currentPage = currentPage
}
}
确保传递的值(在上述情况下为 listArray 和 currentPage)在 ListViewController 中声明。
向 PageViewController 添加一个 Unwind 方法,类似于:
@IBAction func unwindFromListViewController(sender: UIStoryboardSegue) {
pageControl.numberOfPages = listArray.count
pageControl.currentPage = 当前页
setViewControllers([createDetailViewController(currentPage)],方向:.forward,动画:false,完成:nil)
}
上面的setViewControllers指的是PageViewController中写的函数,包含了为当前页面实例化DetailViewController的逻辑
Return segue 是通过从 ListView 中的 TableViewCell 拖动到“退出”按钮(此 UIViewController top/title 视图中三个按钮的最右侧)创建的). 你会被问到应该在 PageViewController 中的 unwind 方法的名称(在上面的例子中我称之为 unwindFromListViewController),所以一定要在尝试进行 segue 之前添加这个方法。
为 ListViewController 添加一个 prepare for segue 函数:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
如果 segue.identifier == "ToPageViewController" {
让控制器 = segue.destination 作为!页面视图控制器
controller.currentPage = 当前页
controller.listArray = 列表数组
}
}
并且在tableView didSelectRowAt中,触发执行segue:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
currentPage = indexPath.row // 将当前页设置为所选行
performSegue(withIdentifier: "ToPageViewController", sender: self)
}
我在网上找不到任何像样的例子来说明这是如何完成的,所以希望这是可以理解和有效的。欢迎任何更正。干杯!
我实现了一个 UIPageViewController,它允许用户通过一个单独的 UITableView add/remove/delete new "pages",类似于Apple 在 iPhone 天气应用程序中实现了 Cities/Weather 位置。项目贴在下面。在这一点上没有天气或幻想 UI – 我只是想专注于下面的 UIPageViewController 管理。如果有人想知道如何使用通过 UITableView 管理的页面来实现 UIPageViewController,希望这对您有用: https://github.com/gallaugher/PageViewControllerDemo
它似乎工作正常,但我是新手并且很不确定我是使用推荐的方法还是 "Swifty"。
现在我有: 页面ViewController [初始视图控制器] - 将委托和数据源设置为自己 - 首先实例化 UIViewController(想象一个用于当地天气的城市ViewController,即使细节和 UI 未在此示例中添加)并设置初始值。 - 城市(天气位置)保存在 [String] 数组中:citiesArray
In CityViewController - 当点击右下角的 "Cities" 按钮(在界面生成器中创建)时,就像 Apple Weather 一样,它会打开一个 UITableView (CityListViewController).
- 为了到达这个 CityListViewController,我触发了一个直接通过界面构建器绘制的 segue,从 CityViewController 中的 "Cities" 按钮到 CityListViewController,以模态方式呈现。
- preapareForSegue 将 citiesArray 传递到目标 CityListViewController (UITableView).
CityListViewController(UITableView) - 用户可以在 UITableView 更新 tableView 和数组中添加城市、移动、删除 - 单击 tableView 行(城市名称或 "Local Weather")触发执行转场,展开到 CityViewController,获取源 CityListViewController 并使用它将数据传回 CityViewController(例如 citiesArray = controller.citiesArray)。 - 这个 @IBAction unwind 函数调用 PageViewController 的 unwind(实际上只是将数据从 CityListViewController 中的 TableView 传递到 UIPageViewController 页面ViewController).
在页面中放松ViewController - 抓取资源(如 CityViewController) - 传回关键数据(例如 citiesArray = controller.citiesArray) - 调用函数为当前页面实例化视图控制器并设置 PageControl 索引等。
Q1: 虽然这似乎有效并且我在测试期间没有设法打破它,但从 UITableView 展开到 ViewController 只是触发另一个展开到 [=43] 是一种合理的方法吗=]PageViewController,除了传递数据之外什么都没做?
Q2: 我已经通过在 PageViewController 中以编程方式构建它来实现 UIPageControl,但是在CityViewController 使用 Interface Builder。这是正确的方法吗?我似乎无法在同一个 VC.
中创建这两个非常感谢那些耐心看完这个令人费解的解释的人。仍在尝试处理 VC 之间传递的数据,以及这与 PageControllers 和 TableViews 的关系。
因为对解决方案感兴趣,我已将其发布到 GitHub,网址为: https://github.com/gallaugher/PageViewControllerDemo 我发布了更通用的名称——PageVewController、DetailViewController 和 ListViewController,因此更容易重用,也许可以遵循。
感谢 Sazan Dauti 在 Whosebug 之外回答这个问题。可以直接在 PageController 和包含用于管理页面的 TableView 和类似页面数组的 ListController 之间进行 segue(例如,就像 Apple 在天气应用程序中所做的那样,您可以在其中 add/delete/move 个城市),保留详细信息(城市在原始示例)不知道它在 PageView 中。 - 将 segue 直接从 UIPageViewController 拖到 UIViewController 和 TableView,在我的例子中,包含位置列表(不是由 PageView 管理的详细信息)。 segue 应该以模态呈现。关键变量应该传递给 ListViewController 以准备在 PageViewController 中进行 segue,如下所示:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "ToListViewController" {
let controller = segue.destination as! ListViewController
controller.listArray = listArray
controller.currentPage = currentPage
}
}
确保传递的值(在上述情况下为 listArray 和 currentPage)在 ListViewController 中声明。
向 PageViewController 添加一个 Unwind 方法,类似于:
@IBAction func unwindFromListViewController(sender: UIStoryboardSegue) { pageControl.numberOfPages = listArray.count pageControl.currentPage = 当前页 setViewControllers([createDetailViewController(currentPage)],方向:.forward,动画:false,完成:nil) }
上面的setViewControllers指的是PageViewController中写的函数,包含了为当前页面实例化DetailViewController的逻辑
Return segue 是通过从 ListView 中的 TableViewCell 拖动到“退出”按钮(此 UIViewController top/title 视图中三个按钮的最右侧)创建的). 你会被问到应该在 PageViewController 中的 unwind 方法的名称(在上面的例子中我称之为 unwindFromListViewController),所以一定要在尝试进行 segue 之前添加这个方法。
为 ListViewController 添加一个 prepare for segue 函数:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 如果 segue.identifier == "ToPageViewController" { 让控制器 = segue.destination 作为!页面视图控制器 controller.currentPage = 当前页 controller.listArray = 列表数组 } }
并且在tableView didSelectRowAt中,触发执行segue:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { currentPage = indexPath.row // 将当前页设置为所选行 performSegue(withIdentifier: "ToPageViewController", sender: self) }
我在网上找不到任何像样的例子来说明这是如何完成的,所以希望这是可以理解和有效的。欢迎任何更正。干杯!