将新页面添加到 PageViewController
Adding a new page into PageViewController
我是 Swift 菜鸟,正在制作一个简单的天气应用程序。我使用了基于页面的应用程序模板。
我遇到的问题如下:
当用户添加一个城市时,我调用 addCity 并成功地将新城市名称附加到我的城市数组中。当我在该函数中打印该数组时,它会在末尾显示新城市。
但是,创建新页面的函数 viewControllerAtIndex 似乎使用了该数组的旧版本,没有附加新城市。当我打印城市数组时,它缺少新的城市名称。因此,当用户滑动时,不会呈现新城市的新页面。用户必须重新启动应用程序才能显示新城市。
我创建了一个屏幕截图视频来说明问题。
(城市数组也应该显示 "London",我想我只是没有重启应用程序)
如有任何帮助,我将不胜感激!
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(for segue:) method to
RootViewController`
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if(segue.identifier == "Locations") {
let destVC: TableViewController = segue.destination as! TableViewController;
destVC.modelViewController = self.modelController;
}
}
这将确保相同的 ModelController
将被移交。
注意:您必须将此标识符 ("Locations") 添加到从编辑按钮到 TableViewController 场景的转场中。
注意 2:此代码未经测试,甚至可能无法编译。我现在 Xcode 没空。
2.) 确保ModelController(单例)实例不能超过1个
一个随机网络 link:https://thatthinginswift.com/singletons/
我是 Swift 菜鸟,正在制作一个简单的天气应用程序。我使用了基于页面的应用程序模板。
我遇到的问题如下:
当用户添加一个城市时,我调用 addCity 并成功地将新城市名称附加到我的城市数组中。当我在该函数中打印该数组时,它会在末尾显示新城市。
但是,创建新页面的函数 viewControllerAtIndex 似乎使用了该数组的旧版本,没有附加新城市。当我打印城市数组时,它缺少新的城市名称。因此,当用户滑动时,不会呈现新城市的新页面。用户必须重新启动应用程序才能显示新城市。
我创建了一个屏幕截图视频来说明问题。
(城市数组也应该显示 "London",我想我只是没有重启应用程序)
如有任何帮助,我将不胜感激!
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(for segue:) method to
RootViewController`
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if(segue.identifier == "Locations") {
let destVC: TableViewController = segue.destination as! TableViewController;
destVC.modelViewController = self.modelController;
}
}
这将确保相同的 ModelController
将被移交。
注意:您必须将此标识符 ("Locations") 添加到从编辑按钮到 TableViewController 场景的转场中。
注意 2:此代码未经测试,甚至可能无法编译。我现在 Xcode 没空。
2.) 确保ModelController(单例)实例不能超过1个
一个随机网络 link:https://thatthinginswift.com/singletons/