将数据从 TableView 传递到 PageViewController 的包含视图

Posted

技术标签:

【中文标题】将数据从 TableView 传递到 PageViewController 的包含视图【英文标题】:pass data from a TableView to the contained Views of a PageViewController 【发布时间】:2017-12-08 11:23:19 【问题描述】:

我有一个带有名称列表的表格视图,我希望在按下表格视图中的一个单元格以将单元格的名称内容传递给即将到来的包含 2 个不同视图的页面视图控制器时。我正在使用一个名为 pulley 的库,我无法通过推送模式来执行 segues,所以在“didSelectRow”方法内部我正在这样做

let pagevc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PageVC") as! PageViewController

(parent as? PulleyViewController)?.setDrawerContentViewController(controller: pagevc, animated: true)

完成对pageviewcontroller的segue。这应该是对的。 但是pageviewcontroller View里面的2个View,都需要选中单元格的Name。所以我这样做了:

pagevc.name = selBarName

并确保我对页面控制器的 2 个视图做同样的事情(仍然在前一个 tableview 类的 didSelectRow 方法中):

let detvc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "DetailVC") as! DetailVC
    detvc.barname = selBarName

    let speisevc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SpeisekarteVC") as! SpeisekarteVC

    speisevc.barname = selBarName

但是在每个类中打印 var barname 表明 var 仍然是一个空字符串。只有 pagevc 的 var 名称已更改为想要的名称。 因此,我在 PageViewController 类的 viewdidload 中实例化了两个视图,但它仍然没有将数据从 pagevc 传递到 pagevc 中包含的其他 2 个视图。

我希望我能把问题弄清楚。如果您需要更多输入,请告诉我缺少什么。基本上我只需要知道如何将一个字符串从 PageViewController 传递给它包含的视图。到目前为止,我可以将所选单元格的名称传递给 pageviewcontroller,但不能传递给 pageviewcontroller 呈现的视图。

编辑:

PageController 本身应该是正确的,因为在其中只使用 2 个空视图,不需要 var 名称就可以正常工作。

这是 PageViewController 类的一部分,只是为了让事情变得完整:

class PageViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource 

var name = ""

var pageControl = UIPageControl()



lazy var orderedViewControllers: [UIViewController] = 
    return [self.newVc(viewController: "DetailVC"),
            self.newVc(viewController: "SpeisekarteVC")]
()

override func viewDidLoad() 
    print(name, "hierpageview") //THIS NAME IS PRINTED CORRECTLY AS WISHED
    super.viewDidLoad()
    self.dataSource = self
    self.delegate = self


    let speisevc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SpeisekarteVC") as! SpeisekarteVC

    speisevc.barname = name

    let detvc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "DetailVC") as! DetailVC
    detvc.barname = name
    print(detvc.barname, "dhdhfhdah") //THIS ONE IS ALSO PRINTED RIGHT BUT PRINTING IT INSIDE THE ACTUAL CLASS RETURNS AGAIN AN EMPTY STRING !!!


    if let firstViewController = orderedViewControllers.first 
        setViewControllers([firstViewController],
                           direction: .forward,
                           animated: true,
                           completion: nil)

    

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




func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? 
    guard let viewControllerIndex = orderedViewControllers.index(of: viewController) else 
        return nil
    

    let previousIndex = viewControllerIndex - 1


    guard previousIndex >= 0 else 

         return nil
    

    guard orderedViewControllers.count > previousIndex else 
        return nil
    

    return orderedViewControllers[previousIndex]


func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? 
    guard let viewControllerIndex = orderedViewControllers.index(of: viewController) else 
        return nil
    

    let nextIndex = viewControllerIndex + 1
    let orderedViewControllersCount = orderedViewControllers.count

    guard orderedViewControllersCount != nextIndex else 

         return nil
    

    guard orderedViewControllersCount > nextIndex else 
        return nil
    

    return orderedViewControllers[nextIndex]


【问题讨论】:

【参考方案1】:

你可以这样做:

在您的目标根控制器中创建一个字符串。 (例如let barName : String = "") 在您的 didSelectRow 方法中,将数据存储到与您所需的 indexPath 相对应的字符串中。 (例如,view.barName //name of your string = // value you want to store, for example if it is an array then maybe myArr[indexPath.row]) 然后在您的destinationViewController 中,在viewDidLoad 方法中,将值推送到所需的标签上。 (例如,yourLbl.text = barName

【讨论】:

是的,我已经这样做了,因为我试图解释,但我只能像这样将值推送到我的 PageViewController。不知何故,不可能将相同的值也推送到 PageViewController 内的 2 个视图。 对其他视图执行相同操作,然后 @AlperMaraz 我做了,但它不起作用。也许我不应该尝试将值推送到 PageViewController 的 viewdidload 方法中,但我不知道在哪里可以这样做。 你能发布你的 SpeisekarteVC 和 DetailVC 的代码吗? @AlperMaraz 我认为它们不相关。至少他们只需要接收字符串值的变化。两者都有 var barname = " " 并且在我没有 PageViewController 之间的所有其他情况下,在 TableView 的 didSelectRow 方法中更改此 var 的值都可以正常工作。

以上是关于将数据从 TableView 传递到 PageViewController 的包含视图的主要内容,如果未能解决你的问题,请参考以下文章