为什么我的指数不会高于 1?
Why won't my index reach higher than 1?
我正在尝试使用 PageViewController 生成新的 ViewControllers,其中包含基于 UserDefaults 中保存的名称数组的数据。当用户将新名称添加到数组中时,PageView 应在每次滑动时生成一个新页面,直到索引 >= 比 array.count。
问题是虽然数组中有 5 个项目,但我可以无限滑动,前两页的索引工作正常,但每次下一次滑动时它都保持在 1,所以它永远不会变成 ==或 >= 这样它将 return Nil。该数组似乎是正确的,打印时它会打印 5 个名称,但由于某种原因它在 pageView 中没有正确索引,任何人都可以确定问题所在吗?
我希望这些信息足够了,管理器是 class,我在其中保存名为 coins 的数组,该数组目前包含 5 个加密货币名称,目的是能够添加一个新页面,附加数组,因此 pageView 将生成一个新页面,从 API 检索数据以加载该硬币的特定数据,非常类似于 IOS 天气应用程序的工作方式。感谢您的帮助,这是 pageViewController 的代码:
import UIKit
class PageViewController: UIPageViewController,
UIPageViewControllerDataSource, UIPageViewControllerDelegate {
//page Control dots
var pageControl = UIPageControl()
func configurePageControl() {
// The total number of pages that are available is based on how
many available colors we have.
pageControl = UIPageControl(frame: CGRect(x: 0,y: UIScreen.main.bounds.maxY - 50,width: UIScreen.main.bounds.width,height: 50))
self.pageControl.numberOfPages = (Manager.shared.coins.count)
self.pageControl.currentPage = 0
self.pageControl.tintColor = UIColor.black
self.pageControl.pageIndicatorTintColor = UIColor.gray
self.pageControl.currentPageIndicatorTintColor = UIColor.white
self.view.addSubview(pageControl)
}
// MARK: Delegate functions
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
let pageContentViewController = pageViewController.viewControllers![0]
self.pageControl.currentPage = (viewControllers?.index(of: pageContentViewController)!)!
}
func viewControllerAtIndex(_ index: Int, storyboard: UIStoryboard) -> TemplateViewController? {
if Manager.shared.coins.count == 0 || index >= Manager.shared.coins.count {
return nil
}
let templateViewController = storyboard.instantiateViewController(withIdentifier: "templateController") as! TemplateViewController
templateViewController.dataObject = Manager.shared.coins[index]
print(Manager.shared.coins)
return templateViewController
}
func indexOfViewController(_ viewController: TemplateViewController) -> Int {
print(viewController.dataObject)
return Manager.shared.coins.index(of: viewController.dataObject) ?? NSNotFound
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
var index = self.indexOfViewController(viewController as! TemplateViewController)
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! TemplateViewController)
if index == NSNotFound {
return nil
}
index += 1
if index == Manager.shared.coins.count {
return nil
}
return self.viewControllerAtIndex(index, storyboard: viewController.storyboard!)
}
//List of View Controllers.
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
configurePageControl()
self.dataSource = self
if let firstViewController = viewControllerAtIndex(0, storyboard: self.storyboard!){
self.setViewControllers([firstViewController], direction: .forward, animated: true, completion: nil)
}
}
}
硬币:
class Manager {
var coins = [""]
let defaults = UserDefaults.standard
static let shared = Manager()
init() {
self.coins = self.defaults.stringArray(forKey: "SavedStringArray") ?? [String]()
}
func addCoin(coin:String) {
self.coins.append(coin)
self.defaults.set(self.coins, forKey: "SavedStringArray")
print ("coins from addCoin:")
print (self.coins)
}
}
然后我从其他地方将硬币添加到数组中,如下所示:
@IBAction func goButton(_ sender: Any) {
self.choosePerm()
Manager.shared.coins.append(chosenCoin)
Manager.shared.addCoin(coin: chosenCoin)
print(Manager.shared.coins)
print(chosenCoin)
}
编辑:上面我编辑了我附加数组的方式,choosePerm() 在搜索完成后获取硬币的名称,而 chosenCoin 是搜索后选择的硬币,它肯定是 1 个名称,但是我仍然让它每次都追加两倍,你能看到里面有什么可能导致这种情况的吗?即它打印
["Ethereum", "Boolberry", "Boolberry", "Bitcoin", "Bitcoin"]
您正在追加硬币两次:
Manager.shared.coins.append(chosenCoin) // <-- appending for the first time
Manager.shared.addCoin(coin: chosenCoin) // <-- appending for the second time
func addCoin(coin:String) {
self.coins.append(coin) // <-- this is the second appending
这种错误可以修复,但不允许从 Manager
class 外部追加:
private(set) var coins = [""]
我正在尝试使用 PageViewController 生成新的 ViewControllers,其中包含基于 UserDefaults 中保存的名称数组的数据。当用户将新名称添加到数组中时,PageView 应在每次滑动时生成一个新页面,直到索引 >= 比 array.count。
问题是虽然数组中有 5 个项目,但我可以无限滑动,前两页的索引工作正常,但每次下一次滑动时它都保持在 1,所以它永远不会变成 ==或 >= 这样它将 return Nil。该数组似乎是正确的,打印时它会打印 5 个名称,但由于某种原因它在 pageView 中没有正确索引,任何人都可以确定问题所在吗?
我希望这些信息足够了,管理器是 class,我在其中保存名为 coins 的数组,该数组目前包含 5 个加密货币名称,目的是能够添加一个新页面,附加数组,因此 pageView 将生成一个新页面,从 API 检索数据以加载该硬币的特定数据,非常类似于 IOS 天气应用程序的工作方式。感谢您的帮助,这是 pageViewController 的代码:
import UIKit
class PageViewController: UIPageViewController,
UIPageViewControllerDataSource, UIPageViewControllerDelegate {
//page Control dots
var pageControl = UIPageControl()
func configurePageControl() {
// The total number of pages that are available is based on how
many available colors we have.
pageControl = UIPageControl(frame: CGRect(x: 0,y: UIScreen.main.bounds.maxY - 50,width: UIScreen.main.bounds.width,height: 50))
self.pageControl.numberOfPages = (Manager.shared.coins.count)
self.pageControl.currentPage = 0
self.pageControl.tintColor = UIColor.black
self.pageControl.pageIndicatorTintColor = UIColor.gray
self.pageControl.currentPageIndicatorTintColor = UIColor.white
self.view.addSubview(pageControl)
}
// MARK: Delegate functions
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
let pageContentViewController = pageViewController.viewControllers![0]
self.pageControl.currentPage = (viewControllers?.index(of: pageContentViewController)!)!
}
func viewControllerAtIndex(_ index: Int, storyboard: UIStoryboard) -> TemplateViewController? {
if Manager.shared.coins.count == 0 || index >= Manager.shared.coins.count {
return nil
}
let templateViewController = storyboard.instantiateViewController(withIdentifier: "templateController") as! TemplateViewController
templateViewController.dataObject = Manager.shared.coins[index]
print(Manager.shared.coins)
return templateViewController
}
func indexOfViewController(_ viewController: TemplateViewController) -> Int {
print(viewController.dataObject)
return Manager.shared.coins.index(of: viewController.dataObject) ?? NSNotFound
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
var index = self.indexOfViewController(viewController as! TemplateViewController)
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! TemplateViewController)
if index == NSNotFound {
return nil
}
index += 1
if index == Manager.shared.coins.count {
return nil
}
return self.viewControllerAtIndex(index, storyboard: viewController.storyboard!)
}
//List of View Controllers.
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
configurePageControl()
self.dataSource = self
if let firstViewController = viewControllerAtIndex(0, storyboard: self.storyboard!){
self.setViewControllers([firstViewController], direction: .forward, animated: true, completion: nil)
}
}
}
硬币:
class Manager {
var coins = [""]
let defaults = UserDefaults.standard
static let shared = Manager()
init() {
self.coins = self.defaults.stringArray(forKey: "SavedStringArray") ?? [String]()
}
func addCoin(coin:String) {
self.coins.append(coin)
self.defaults.set(self.coins, forKey: "SavedStringArray")
print ("coins from addCoin:")
print (self.coins)
}
}
然后我从其他地方将硬币添加到数组中,如下所示:
@IBAction func goButton(_ sender: Any) {
self.choosePerm()
Manager.shared.coins.append(chosenCoin)
Manager.shared.addCoin(coin: chosenCoin)
print(Manager.shared.coins)
print(chosenCoin)
}
编辑:上面我编辑了我附加数组的方式,choosePerm() 在搜索完成后获取硬币的名称,而 chosenCoin 是搜索后选择的硬币,它肯定是 1 个名称,但是我仍然让它每次都追加两倍,你能看到里面有什么可能导致这种情况的吗?即它打印
["Ethereum", "Boolberry", "Boolberry", "Bitcoin", "Bitcoin"]
您正在追加硬币两次:
Manager.shared.coins.append(chosenCoin) // <-- appending for the first time
Manager.shared.addCoin(coin: chosenCoin) // <-- appending for the second time
func addCoin(coin:String) {
self.coins.append(coin) // <-- this is the second appending
这种错误可以修复,但不允许从 Manager
class 外部追加:
private(set) var coins = [""]