将 UITableViewController 中选定单元格中的“正确”数据传递给 ViewController

Posted

技术标签:

【中文标题】将 UITableViewController 中选定单元格中的“正确”数据传递给 ViewController【英文标题】:Passing the “correct” Data from the selected cell in a UITableViewController to a ViewController 【发布时间】:2017-07-18 11:56:46 【问题描述】:

我遇到了同样的麻烦here 我还没有弄清楚如何将正确的数据从 TableViewController 传递到另一个 ViewController。我从 JSON 获取数据我拥有我需要的一切,但是通过选择任何显示的行数据是最后一行中的数据。我需要获取有关我选择 TableViewController 的确切行的信息。

import UIKit

class TableViewController: UITableViewController 

var TableData:Array< String > = Array < String >()

func getData(_ link: String) 
    let url: URL = URL(string: link)!
    let session = URLSession.shared
    let request = NSMutableURLRequest(url: url)
    request.httpMethod = "GET"
    request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData

    let task = session.dataTask(with: request as URLRequest, completionHandler: 
        (data, response, error) in
        guard let _: Data = data , let _: URLResponse = response , error == nil else 
            return
        
        self.extractJSON(data!)
    )
    task.resume()


func extractJSON(_ data: Data) 
    let json: Any?
    do 
        json = try JSONSerialization.jsonObject(with: data, options: [])
     catch 
        return
    
    guard let dataList = json as? NSArray else 
        return
    
    if let countriesList = json as? NSArray 
        for i in 0 ..< dataList.count 
            if let countriesObj = countriesList[i] as? NSDictionary 
                if let countryName = countriesObj["country"] as? String 
                    if let countryCode = countriesObj["code"] as? String 
                        TableData.append(countryName + " [" + countryCode + "]")
                        UserDefaults.standard.set(String(describing: countryName), forKey: "name")
                        UserDefaults.standard.set(String(describing: countryCode), forKey: "code")
                        UserDefaults.standard.synchronize()
                    
                
            
        
    

    DispatchQueue.main.async(execute: self.doTableRefresh())


func doTableRefresh() 
    self.tableView.reloadData()


override func viewDidLoad() 
    super.viewDidLoad()
    self.tableView.delegate = self
    self.tableView.dataSource = self
    getData("http://www.kaleidosblog.com/tutorial/tutorial.json")


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


// MARK: - Table view data source

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


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


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

    cell.textLabel?.text = TableData[indexPath.row]

    return cell


【问题讨论】:

您可以使用 tableViewDidSelectRowAtIndexPath 来获取您的数据并将其传递给 vc 【参考方案1】:

你可以使用tableViewDidSelectRowAtIndexPath委托方法

let string = TableData[indexPath.row]

获取您的数据并将其传递给 vc

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
   let string = TableData[indexPath.row]

    let vc = // Your VC From Storyboard 
    vc.data =  string // 
    self.navigationController?.pushViewController(vc, animated: true)

【讨论】:

很抱歉,我没有找到使用它的方法。如何使用这块代码? 你不需要在任何地方调用这个方法。 tableView:didSelectRowAtIndexPath: 是 UITableView 的委托方法。它在选择发生时调用。此方法通知委托指定的行现在已被选中。 @VahidGR 您可以将其放在代码中的任何位置,然后就完成了!!,如果有帮助,请接受答案 @MikeAlter 哦,是的,我忘了这样做 :D 谢谢 @PrashantTukadiya 一旦你传递了上下文,你将如何从特定的 message_id 加载特定的聊天对话?【参考方案2】:
tableView:didSelectRowAtIndexPath: 

告诉代理指定的行现在被选中。使用indexPath 在tableView 中定位新选定的行。 在你的下一个视图控制器中声明一个 var。

var yourObject:String!

您可以使用选定单元格的索引路径访问选定单元格的数据,然后将数据发送到下一个视图控制器。访问下一个视图控制器 yourObject 的 var 并传递所需的数据。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
let string = TableData[indexPath.row]

if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController ") as? SecondViewController 
    viewController.yourObject = yourObject
    if let navigator = navigationController 
        navigator.pushViewController(viewController, animated: true)
    
  

【讨论】:

以上是关于将 UITableViewController 中选定单元格中的“正确”数据传递给 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

将 UITableViewController 子类重构为 UIViewController 子类

如何将单元格插入 UITableViewController

如何将 UITableView 或 UITableViewController 集成到 UIPageViewController 中?

将 UINavigationBar 添加到没有 UINavigationController 的 UITableViewController

UITableViewController 没有将视图推送到堆栈上

将 UITableViewController 添加到其他视图