【问题标题】:Why won't my index reach higher than 1?为什么我的指数不会高于 1?
【发布时间】:2018-07-29 11:55:22
【问题描述】:

我正在尝试使用 PageViewController 来生成新的 ViewController,其中包含基于 UserDefaults 中保存的名称数组的数据。当用户将新名称添加到数组中时,PageView 应该在每次滑动时生成一个新页面,直到索引 >= 比 array.count。

问题是虽然数组中有 5 个项目,但我可以无限滑动,前两页的索引正常工作,但在每次下一次滑动时它都保持在 1,所以它永远不会变成 == 或 > = 这样它将返回 Nil。该数组似乎是正确的,在打印时会打印 5 个名称,但由于某种原因,它在 pageView 中的索引不正确,任何人都可以确定问题可能是什么?

我希望这是足够的信息,Manager 是我保存名为 coin 的数组的类,其中包含目前 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() 搜索完成后获取硬币的名称,并且 selectedCoin 是搜索后选择的硬币,它肯定是 1 名称,但我是仍然让它每次都附加双倍,你能看到任何可能导致这种情况的东西吗?即它打印

["Ethereum", "Boolberry", "Boolberry", "Bitcoin", "Bitcoin"]

【问题讨论】:

  • 请不要在 Swift 中使用NSNotFound。只需使用可选的Int
  • 同一个数据对象是否可能在您的列表中出现两次?这会导致您描述的问题。
  • 显示您的coins 数组是如何设置的
  • @Sulthan 我注意到当我出于某种原因添加硬币时,它确实会附加两次。所以例如 ["bitcoin", "ethereum" "ethereum"] 我会尝试解决这个问题,看看会发生什么。
  • @PeterRuppert 不要误会我的意思——我完全同意您删除问题的第一个版本!那是完全正确的做法。这次你提供了更好的信息(经过一些提示)。但是如果你停止使用 NSNotFound,你会仍然更快乐。

标签: ios swift indexing uipageviewcontroller


【解决方案1】:

您将硬币追加两次:

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类之外追加:

private(set) var coins = [""]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2014-04-03
    • 1970-01-01
    • 2023-01-08
    相关资源
    最近更新 更多