【问题标题】:Same UIViewControllers in UIPageViewControllerUIPageViewController 中的相同 UIViewControllers
【发布时间】:2018-08-13 15:12:50
【问题描述】:

我需要一个 UIPageViewController 来显示与数组中可用数据一样多的 UIViewController。 假设我有一个 Int 数组,对于每个 Int,我希望 UIViewController 在 UILabel 中显示其中一个。 为此,我在主情节提要中创建了 UIPageViewController 和 UIViewController 及其 UILabel。

这是我为 UIPageViewController 编写的代码:

import UIKit
import RealmSwift

class PageViewController: UIPageViewController, UIPageViewControllerDataSource {

    lazy var subViewControllers: [UIViewController] = {
        return [
            self.createNewVC(withName: "CounterViewController"),
            self.createNewVC(withName: "CounterViewController"),
            self.createNewVC(withName: "CounterViewController")
        ]
    }()

    var dataArray: [Int] = [30, 134, 345]

    override func viewDidLoad() {
        super.viewDidLoad()
        self.dataSource = self
        setViewControllers([subViewControllers[0]], direction: .forward, animated: true, completion: nil)
    }

    // Creates a new ViewController
    func createNewVC(withName name: String) -> UIViewController {
        return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: name)
    }

    // Returns the previous ViewController
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        let currentIndex: Int = subViewControllers.index(of: viewController) ?? 0

        if (currentIndex <= 0) {
            return nil
        }

        if let previous = subViewControllers[currentIndex - 1] as? CounterViewController {
            previous.daysLeftLabel.text = String(dataArray[currentIndex])
            return previous
        } else {
            return nil
        }
    }

    // Returns the next ViewController
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        let currentIndex: Int = subViewControllers.index(of: viewController) ?? 0

        if (currentIndex >= subViewControllers.count - 1) {
            return nil
        }

        if let next = subViewControllers[currentIndex + 1] as? CounterViewController {
            next.daysLeftLabel.text = "0"
            return next
        } else {
            return nil
        }
    }

}

这是 UIViewController 的代码

import UIKit

class CounterViewController: UIViewController {

    @IBOutlet weak var daysLeftLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

注意:“CounterViewController”也是 UIViewController StoryBoardID

问题是,当我第一次向右滚动时,应用程序在 next.daysLeftLabel.text = "0" 这一行崩溃,说它在展开 Optional 时发现了一个 nil 值。

我在这里做错了什么?

我也想借此机会问一些事情。 在这种情况下,您可能已经猜到了,我使用的是 UIPageViewController,它拥有相同的 UIViewControllers 但显示的数据不同,这是实现此目的的最佳方法?我这样做是正确的还是有更简单、更清洁的方法?

【问题讨论】:

    标签: ios swift uiviewcontroller uilabel uipageviewcontroller


    【解决方案1】:

    这条线崩溃了

    next.daysLeftLabel.text = "0"
    

    因为daysLeftLabel 在 VC 加载之前为零,所以您需要

    class CounterViewController: UIViewController {
      @IBOutlet weak var daysLeftLabel: UILabel!
       var sendedText = ""
        override func viewDidLoad() {
         super.viewDidLoad()
          daysLeftLabel.text = sendedText
          // Do any additional setup after loading the view.
        }
    
    }
    

    然后使用

    next.sendedText = "0"
    

    【讨论】:

    • 这确实解决了我的问题,谢谢!顺便说一句,这是一个有效的实现吗?来自 Android,我永远不会创建将显示在标签中的变量
    • 这是发送值的唯一方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多