【问题标题】:Checking approach: Managing UIPageViewController page data using UITableView cells检查方法:使用 UITableView 单元格管理 UIPageViewController 页面数据
【发布时间】:2016-11-15 17:25:36
【问题描述】:

我已经实现了一个 UIPageViewController,它允许用户通过单独的 UITableView 添加/删除/删除新的“页面”,类似于 Apple 在 iPhone 天气应用程序中实现城市/天气位置的方式。项目贴在下面。在这一点上没有天气或花哨的用户界面——我只是想把注意力集中在下面的 UIPageViewController 管理上。如果有人想知道如何使用通过 UITableView 管理的页面来实现 UIPageViewController,希望这很有用: https://github.com/gallaugher/PageViewControllerDemo

它似乎工作正常,但我是新手,我很不确定我是使用推荐的方法还是“Swifty”。

现在我有: PageViewController [初始视图控制器] - 将委托和数据源设置为自己 - 实例化第一个 UIViewController(想象一个用于本地天气的 CityViewController,即使此示例中未添加详细信息和 UI)并设置初始值。 - 城市(天气位置)保存在 [String] 数组中:cityArray

在 CityViewController 中 - 当点击右下角的“Cities”按钮时(在界面构建器中创建),如 Apple Weather,它会打开一个 UITableView (CityListViewController)。
- 为了访问这个 CityListViewController,我触发了直接通过界面生成器从 CityViewController 中的“Cities”按钮绘制到 CityListViewController 的 segue,以模态方式呈现。 - preapareForSegue 将 cityArray 传递给目标 CityListViewController (UITableView)。

在 CityListViewController (UITableView) - 用户可以在 UITableView 更新 tableView & array 中添加城市、移动、删除 - 单击 tableView 行(城市名称或“本地天气”)触发执行 segue,展开到 CityViewController,获取源 CityListViewController 并使用它将数据传回 CityViewController(例如,citiesArray = controller.citiesArray)。 - 这个@IBAction unwind 函数调用PageViewController 的unwind(实际上只是将数据从CityListViewController 中的TableView 传递到UIPageViewController PageViewController)。

在 PageViewController 中展开 - 抓取源(作为 CityViewController) - 传回关键数据(例如,citiesArray = controller.citiesArray) - 调用函数为当前页面实例化视图控制器并设置PageControl索引等

第一季度: 虽然这似乎有效并且我在测试期间没有设法打破它,但从 UITableView 展开到 ViewController 是否是一种合理的方法,它只是触发另一个展开到 UIPageViewController,除了传递数据之外什么都不做?

第二季度: 我已经通过在 PageViewController 中以编程方式构建 UIPageControl 来实现它,但是与 CityListViewController(UITableView)相连接的按钮是使用 Interface Builder 在 CityViewController 中创建的。这是正确的方法吗?我似乎无法在同一个 VC 中创建这两个。

非常感谢那些耐心看完这个复杂的解释的人。仍在尝试处理 VC 之间的数据传递,以及这与 PageControllers 和 TableViews 的关系。

【问题讨论】:

    标签: swift uitableview uipageviewcontroller


    【解决方案1】:

    对于这个对解决方案感兴趣的人,我在 GitHub 上发布了: https://github.com/gallaugher/PageViewControllerDemo 我已经发布了更通用的名称 - PageVewController、DetailViewController 和 ListViewController,所以这更容易重用并且可能会遵循。

    感谢 Sazan Dauti 在 StackOverflow 之外回答这个问题。可以直接在 PageController 和 ListController 之间进行分隔,其中包含用于管理页面的 TableView 一组类似页面(例如,就像 Apple 在 Weather 应用程序中所做的那样,您可以在其中添加/删除/移动城市),保留详细信息(Cities in原始示例)不知道它在 PageView 中。 - 使用 TableView 将 segue 直接从 UIPageViewController 拖到 UIViewController,在我的情况下,TableView 包含位置列表(不是由 PageView 管理的详细信息)。 segue 应该以模态方式呈现。在 PageViewController 中为 segue 做准备时,应将关键变量传递给 ListViewController,如下所示:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
     if segue.identifier == "ToListViewController" {
      let controller = segue.destination as! ListViewController
      controller.listArray = listArray
      controller.currentPage = currentPage
     }
    }
    
    • 确保在 ListViewController 中声明了传递的值(上例中的 listArray 和 currentPage)。

    • 向 PageViewController 添加一个 Unwind 方法,类似于:

      @IBAction func unwindFromListViewController(sender: UIStoryboardSegue) { pageControl.numberOfPages = listArray.count pageControl.currentPage = currentPage setViewControllers([createDetailViewController(currentPage)],方向:.forward,动画:false,完成:nil) }

    上面的setViewControllers是指PageViewController中写的函数,包含为当前页面实例化DetailViewController的逻辑。

    • 返回 segue 是通过从 ListView 中的 TableViewCell 拖动到“退出”按钮(此 UIViewController 顶部/标题视图的三个按钮的最右侧)创建的。系统会询问您的名称应该在 PageViewController 中的 unwind 方法(在上面的示例中,我将其称为 unwindFromListViewController),因此请务必在尝试进行 segue 之前添加此方法。

    • 为 ListViewController 添加一个准备 segue 功能:

      override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 如果 segue.identifier == "ToPageViewController" { 让控制器 = segue.destination 为!页面视图控制器 控制器.currentPage = currentPage 控制器.listArray = listArray } }

    • 并在tableView中didSelectRowAt,触发perform segue:

      func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { currentPage = indexPath.row // 将当前页面设置为选中的行 performSegue(withIdentifier:“ToPageViewController”,发件人:self) }

    我在网上找不到任何像样的示例来演示这是如何完成的,因此希望这是可以理解和有效的。欢迎任何更正。干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      相关资源
      最近更新 更多