Swift 将新页面添加到PageViewController中

Swift 将新页面添加到PageViewController中,swift,swift3,uipageviewcontroller,Swift,Swift3,Uipageviewcontroller,我是一个敏捷的noob,正在制作一个简单的天气应用程序。我使用了基于页面的应用程序模板 我的问题如下: 当用户添加一个城市时,我调用addCity并成功地将新城市名称附加到我的城市数组中。当我在该函数中打印该数组时,它会在末尾显示新的城市 但是,创建新页面的函数viewControllerAtIndex似乎使用了该数组的旧版本,没有附加新的城市。打印城市数组时,它缺少新的城市名称。因此,当用户刷卡时,不会出现新城市的新页面。用户必须重新启动应用程序才能显示新城市 我制作了一个屏幕截图视频来说明这

我是一个敏捷的noob,正在制作一个简单的天气应用程序。我使用了基于页面的应用程序模板

我的问题如下:

当用户添加一个城市时,我调用addCity并成功地将新城市名称附加到我的城市数组中。当我在该函数中打印该数组时,它会在末尾显示新的城市

但是,创建新页面的函数viewControllerAtIndex似乎使用了该数组的旧版本,没有附加新的城市。打印城市数组时,它缺少新的城市名称。因此,当用户刷卡时,不会出现新城市的新页面。用户必须重新启动应用程序才能显示新城市

我制作了一个屏幕截图视频来说明这个问题

(城市阵列也应该显示“伦敦”,我想我只是没有重新启动应用程序)

我将非常感谢您的帮助

import UIKit

class ModelController: NSObject, UIPageViewControllerDataSource {

    var rootViewController = RootViewController()
    var cities = [""]
    let defaults = UserDefaults.standard

    override init() {
        super.init()

        self.cities = self.defaults.stringArray(forKey: "SavedStringArray") ?? [String]()

        if self.cities == [""] || self.cities.count == 0  {
            self.cities = ["Current Location"]
        }
    }

    func addCity(name:String) {
        self.cities.append(name)
        self.defaults.set(self.cities, forKey: "SavedStringArray")
        print ("cities from addCity:")
        print (self.cities)

    }


    func viewControllerAtIndex(_ index: Int, storyboard: UIStoryboard) -> DataViewController? {
        // Return the data view controller for the given index.
        if (self.cities.count == 0) || (index >= self.cities.count) {
            return nil
        }

        // Create a new view controller and pass suitable data.
        let dataViewController = storyboard.instantiateViewController(withIdentifier: "DataViewController") as! DataViewController

        //get city name
        dataViewController.dataObject = self.cities[index]
        print ("cities in viewControllerAtIndex:")
        print (self.cities)

        return dataViewController
    }



    func indexOfViewController(_ viewController: DataViewController) -> Int {
        // Return the index of the given data view controller.
        // For simplicity, this implementation uses a static array of model objects and the view controller stores the model object; you can therefore use the model object to identify the index.
        return self.cities.index(of: viewController.dataObject) ?? NSNotFound
    }


    // MARK: - Page View Controller Data Source

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        var index = self.indexOfViewController(viewController as! DataViewController)
        if (index == 0) || (index == NSNotFound) {
            return nil
        }

        index -= 1
        return self.viewControllerAtIndex(index, storyboard: viewController.storyboard!)
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        var index = self.indexOfViewController(viewController as! DataViewController)
        if index == NSNotFound {
            return nil
        }

        index += 1
        if index == self.cities.count {
            return nil
        }
        return self.viewControllerAtIndex(index, storyboard: viewController.storyboard!)
    }

}

问题是,您使用了
ModelController
的两个不同实例。一个用于RootViewController,另一个用于
TableViewController
。他们彼此不认识

解决此问题的两个选项:

1.)进入时,将
ModelController
的同一实例移交给
TableViewController

例如,通过将此
prepare(对于segue:)方法添加到
RootViewController`

func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if(segue.identifier == "Locations") {

            let destVC: TableViewController = segue.destination as! TableViewController;
            destVC.modelViewController = self.modelController;

        }
    }
这将确保移交相同的
ModelController

注意:必须将此标识符(“位置”)添加到从“编辑”按钮到TableViewController场景的序列中

注2:此代码未经测试,甚至可能未编译。我现在没有可用的Xcode

2.)确保ModelController(Singleton)的实例不能超过一个


一个随机的web链接:

您在哪里为
TableViewController
设置
ModelController
?你也能粘贴代码吗?嘿@cweinberger!请看这里的所有代码:这很有效。非常感谢。我假设这与不使用相同的实例有关。剩下的唯一问题是,当我在数组的最后一页时,我必须向左滑动,然后再向右滑动,以显示新位置。要解决此问题(以及其他可能有趣的情况,例如删除当前显示的城市),可能需要再次调用。