【问题标题】:Passing Data from ViewController to UITableViewController将数据从 ViewController 传递到 UITableViewController
【发布时间】:2018-10-31 00:33:49
【问题描述】:

请帮助我了解我缺少什么?

故事板设置:

ViewController -> TabBarController -> NavigationController 包含一个 TableViewController

ViewControllerTabBarController

的标识符为“startUp

ViewController 是初始进入屏幕。 ViewController 有一个 SegmentedControl 和一个 Button

用法:用户选择其中一个片段并按下按钮。该视图应与 TableViewController 保持一致,并将 NavigationItem.Title 替换为所选 SegmentedControl 段中的标题。

问题:数据没有从 ViewController 传递到 TableViewController(并通过 TabBarController 和 NavigationController)。我总是以 TableViewController 上的空白标题标题结束。在过去的几天里,我在这里和网络上的其他位置使用 segue 和其他方法仔细浏览了几十个“操作方法”。在这一点上似乎没有任何工作,我很头晕(可能错过了一些非常非常基本的东西)。

这是代码当前“坐”的方式

ViewController 代码:

import UIKit

class ViewController: UIViewController {
    var someData: String? = ""

    @IBOutlet weak var cpChoice: UISegmentedControl!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func startBut(_ sender: Any) {
        performSegue(withIdentifier: "startUp", sender: self)
    }

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

        let theIndex = cpChoice.selectedSegmentIndex
        someData = cpChoice.titleForSegment(at: theIndex)

        print(someData!) //outputs correctly to console

        if segue.destination is CheckpointVC
        {
            let vc = segue.destination as? CheckpointVC
            vc?.data = someData!
        }
    }
}

TableViewController 代码:

import UIKit

class CheckpointVC: UITableViewController {

    var data: String = ""

    @IBOutlet weak var theHeader: UINavigationItem!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationItem.title = data
        //theHeader.title = data
    }


    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 0
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return 0
    }
}

【问题讨论】:

    标签: ios swift uitableview


    【解决方案1】:

    您是否在 segue 上设置断点以实际检查 segue.destination 是否为 CheckpointVC?解决方案一直就在您的眼前。由于您已经设置了视图控制器......

    ViewController -> TabBarController -> NavigationController which contains a TableViewController
    

    除非标识符为 startUp 的 segue 指向 TableViewVC,否则您的 segue.destination 在技术上是 TabBarController。

    解决它的一种简单方法是从 TabBarVC 中解开 TableVC,如下所示:

    (tabBarVC.viewControllers[indexOfYourNavVC] as? NavigationController).viewControllers.first as? TableVC)
    

    更长但更简洁的方法是实现此博客中的路由模式。很抱歉,我自己还在学习这个,所以我只能推荐网站开始: https://clean-swift.com/routing-in-clean-swift/

    【讨论】:

    • 好吧……你说得有道理。在“if segue.destination is CheckpointVC”中设置断点时,断点永远不会触发。 segue 确实首先转到 TabBarController ... 然后传递到 NavigationController 并在 TableViewController (CheckpointVC) 上结束。但这让我想知道将“someData”变量一直传递到 CheckpointVC 的最佳做法是什么?
    • 我已经更新了我的答案以帮助解决你的问题(希望你自己觉得它有帮助)@craab
    【解决方案2】:

    只需将 segue 目标替换为包含您的 CheckpointVC 作为根视图控制器的导航控制器。

    【讨论】:

      【解决方案3】:

      解决方案

      件定义

      ViewController.swift

      import UIKit
      
      class ViewController: UIViewController {
      
          var someData: String? = ""
      
          @IBOutlet weak var cpChoice: UISegmentedControl!
      
          override func viewDidLoad() {
              super.viewDidLoad()
          }
      
          @IBAction func startBut(_ sender: Any) {
              performSegue(withIdentifier: "startUp", sender: self)
          }
      
          override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      
              //get the string representing the segment chosen and assign it to someData
              let theSegmentChosen = cpChoice.selectedSegmentIndex
              someData = cpChoice.titleForSegment(at: theSegmentChosen)
      
      
              let barVC = segue.destination as! UITabBarController //
              let navigationControllerDestination = barVC.viewControllers?[0] as? navVC //the array index [0] indicates the first view controller belonging to the TabBarController
              let firstViewControllerOfNavigationController = navigationControllerDestination?.topViewController as! CheckpointVC
              firstViewControllerOfNavigationController.data = someData!
          }
      }
      

      TabBarVC

      import UIKit
      
      class TabBarVC: UITabBarController {
      
          override func viewDidLoad() {
              super.viewDidLoad()
      
              // Do any additional setup after loading the view.
          }
      }
      

      NavVC

      import UIKit
      
      class navVC: UINavigationController {
      
          override func viewDidLoad() {
              super.viewDidLoad()
      
              // Do any additional setup after loading the view.
          }
      
      }
      

      CheckpointVC.swift

      import UIKit
      
      class CheckpointVC: UITableViewController {
      
          //the variable we'll pass the data to from the starting viewcontroller
          var data: String = ""
      
          @IBOutlet weak var theHeader: UINavigationItem!
      
          override func viewDidLoad() {
              super.viewDidLoad()
              theHeader.title = data
          }
      
      
          override func numberOfSections(in tableView: UITableView) -> Int {
              // #warning Incomplete implementation, return the number of sections
              return 0
          }
      
          override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
              // #warning Incomplete implementation, return the number of rows
              return 10
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-08
        • 2021-05-04
        • 1970-01-01
        相关资源
        最近更新 更多