检查方法:使用UITableView单元管理UIPageViewController页面数据

时间:2016-11-15 17:25:36

标签: swift uitableview uipageviewcontroller

我已经实现了一个UIPageViewController,允许用户添加/删除/删除新的"页面"通过单独的UITableView,类似于Apple在iPhone Weather应用程序中实现城市/天气位置的方式。项目发布在下面。此时没有天气或花哨的用户界面 - 我只是试着关注下面的UIPageViewController管理。希望如果有人想知道如何使用UITableView管理的页面实现UIPageViewController,这将非常有用: https://github.com/gallaugher/PageViewControllerDemo

它似乎工作得很好,但我对这个&很不确定我是否使用推荐的方法完成了这项工作,或者是否已经使用了#34; Swifty"。

enter image description here

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

在CityViewController中 - 当"城市"右键单击按钮(在界面生成器中创建),如Apple Weather,它会打开一个UITableView(CityListViewController)。
- 为了到达这个CityListViewController,我触发了一个直接通过" Cities"的界面构建器绘制的segue。 CityViewController中的按钮到CityListViewController,呈现模态。 - preapareForSegue将citiesArray传递到目标CityListViewController(UITableView)。

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

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

Q1: 虽然这似乎工作&我还没有设法在测试过程中破解它,这是一个从UITableView转到一个ViewController的声音方法,它只是触发另一个UIPageViewController的展开,除了传递数据之外什么都没做?

Q2: 我通过在PageViewController中以编程方式构建UIPageControl来实现它,但是使用Interface Builder在CityViewController中创建了分隔到CityListViewController(UITableView)的按钮。这是正确的方法吗?我似乎无法在同一个VC中创建这两个。

非常感谢那些有耐心通过这个错综复杂的解释的人。仍然试图处理VC之间的数据传递,以及它与PageControllers& TableViews。

1 个答案:

答案 0 :(得分:0)

对于我对GitHub发布的解决方案感兴趣: https://github.com/gallaugher/PageViewControllerDemo 我发布了更多通用名称 - PageVewController,DetailViewController和ListViewController,因此这更容易重用,也许可以遵循。

感谢Sazan Dauti在StackOverflow之外回答这个问题。可以直接在PageController和&之间进行切换。 ListController包含一个TableView,用于管理页面类似页面的数组(例如Apple在Weather应用程序中可以添加/删除/移动城市),保持Detail(城市在原始示例中)不受任何知识的影响一个PageView。 - 将一个segue直接从UIPageViewController拖到带有TableView的UIViewController,在我的例子中,它包含一个位置列表(不是由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
 }
}
  • 确保传递的值(在上面的情况下为listArray& currentPage)在ListViewController中声明。

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

    @IBAction func unwindFromListViewController(sender:UIStoryboardSegue){     pageControl.numberOfPages = listArray.count     pageControl.currentPage = currentPage     setViewControllers([createDetailViewController(currentPage)],direction:.forward,animated:false,completion:nil) }

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

  • 返回segue是通过从ListView中的TableViewCell拖动到“退出”按钮(此UIViewController顶部/标题视图的三个按钮的最右侧)创建的。您将被要求输入名称一个unwind方法应该在PageViewController中(在上面的例子中我称之为unwindFromListViewController),所以一定要在尝试制作segue之前添加这个方法。

  • 为ListViewController添加一个segue函数的准备工作:

    覆盖func prepare(对于segue:UIStoryboardSegue,sender:Any?){     if segue.identifier ==“ToPageViewController”{         让controller = segue.destination为! PageViewController         controller.currentPage = currentPage         controller.listArray = listArray     } }

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

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

我在网上找不到任何体面的例子来证明这是如何完成的,所以希望这是可以理解和有效的。欢迎任何更正。干杯!