【问题标题】:Cannot pass data from UIViewController to UIPageViewController and other views无法将数据从 UIViewController 传递到 UIPageViewController 和其他视图
【发布时间】:2020-08-29 11:25:18
【问题描述】:

我有一个指向 PageViewControler 的 segue,它控制两个 ViewControler,虽然我认为我已正确设置它并且可以顺利运行它,但我无法将数据传递给其他两个视图。 我错过了什么?
无论如何,这是我从单元格指向 PageViewControler 的转场:

   class HomeViewController:  UIViewController, UITableViewDelegate, UITableViewDataSource {
     if segue.identifier == "showDetails" {

            let localDetails = segue.destination as! localDetails

            let IndexPath = self.tableView.indexPathForSelectedRow!
            let row = IndexPath.row

        tableView.deselectRow(at: IndexPath, animated: true)

            localDetails.index = row
            let singleLocalInfo = restaurants[row]
            localDetails.localName = singleLocalInfo.locale }}

我的 PageViewControler:

class PageViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {

   func newVc(viewController: String) -> UIViewController {
         return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: viewController)
     }

    lazy var orderedViewControllers: [UIViewController] = {
         return [self.newVc(viewController: "localDetails"),
                 self.newVc(viewController: "blueScreen")]
     }()  etc,etc... }

最后是我需要显示数据的 viewControler:

class localDetails: UIViewController {

  var localName: String = ""

  etc... 

}

我不得不削减大部分代码,但你明白了。 谢谢

【问题讨论】:

  • 检查委托和闭包以传递数据
  • 我做了,但据我了解,代表是为了返回数据。
  • tableView.deselectRow(at: IndexPath, animated: true) 为什么要调用这个函数?
  • 哦,这只是为了获取所选行的索引号。

标签: ios swift uiviewcontroller delegates uipageviewcontroller


【解决方案1】:

基本上...

在您的类中实例化并连接到您的页面视图控制器,在那里设置属性,然后在它们各自的控制器中设置它们。

假设“showDetails”是您的页面视图控制器的 segue 标识符:

class HomeViewController:  UIViewController, UITableViewDelegate, UITableViewDataSource {

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

        if segue.identifier == "showDetails" {

            let pageVC = segue.destination as! PageViewController

            let IndexPath = self.tableView.indexPathForSelectedRow!
            let row = IndexPath.row

            tableView.deselectRow(at: IndexPath, animated: true)

            pageVC.index = row
            let singleLocalInfo = restaurants[row]
            pageVC.localName = singleLocalInfo.locale
            pageVC.blueValue = "the value for blueScreen"

        }

    }
}

class PageViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {

    var index: Int = 0
    var localName: String = ""
    var blueValue: String = ""

    func newVc(viewController: String) -> UIViewController {
        return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: viewController)
    }

    lazy var orderedViewControllers: [UIViewController] = {
        let v1 = self.newVc(viewController: "localDetails")
        v1.localName = self.localName
        let v2 = self.newVc(viewController: "blueScreen")
        v2.blueValue = self.blueValue
        return [v1, v2]
    }()

    //etc,etc...

}

【讨论】:

  • 您好 DonMago,感谢您的帮助。一开始它没有用,但是当我添加“as!localDetails”时,它设法传递数据。 :) 谢谢
猜你喜欢
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
相关资源
最近更新 更多