在Swift中将数据从TableView传递到ViewController

4
我有一个tableView从php json中使用Alamofire加载数据,它在tableView上完美地加载了数据,现在我想将数据传递到第二个viewController以显示更多详细信息,但是我遇到了这个错误:无法在范围内找到数据。
func getUsers() {
    AF.request(SiteUrl).validate().responseJSON { response in
        switch response.result {
        case .success:
            print("Validation Successful)")

            if let json = response.data {
                do{
                    let jsonData = try JSON(data: json)
                    self.data = jsonData.arrayValue
                    self.tableView.reloadData() // we are already on the main thread
                    //print("DATA PARSED: \(jsonData)")
                }
                catch {
                    print("JSON Error", error)
                }
            }
        case .failure(let error):
            print(error)
        }
    }
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return data.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let customCell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell

    let item = data[indexPath.row]
    customCell.AdTitle?.text = item["title"].string
    customCell.AdDate?.text = item["time"].string

    let imageUrl = item["document"].string
    let url = NSURL(string:("https://qateef-ads.co/uploads/" + imageUrl!))
    customCell.AdImage.sd_setImage(with: url as URL?, placeholderImage: UIImage(named: "placeholder.png"))

    return customCell
}


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            
    let vc = storyboard?.instantiateViewController(withIdentifier: "DetailsViewController") as? DetailsViewController
    self.navigationController?.pushViewController(vc!, animated: true)
    vc?.imageView = UIImage(named: url)
    vc?.AdTitle = item["title"].string
}

我如何将数据从一个视图传递到另一个视图?


你的 didSelectRowAt 方法是否从选中的单元格获取数据?哪一行显示了“无法在范围内找到数据”的字样? - Waylan Sands
哪个错误?编译之前?哪一行?在哪里? - Larme
这两行代码有错误。vc?.imageView = UIImage(named: url) vc?.AdTitle = item["title"].string - Jacob
3个回答

1
我不确定我是否正确理解了你的问题。但是,如果你需要在第二个视图控制器上访问该数据,最简单的方法是将该数据注入选中单元格时实例化的DetailsViewController中。
但首先,你需要创建该属性:
class DetailsViewController: UIViewController {
    var data: JSON?
    
    ...

}

然后在实例化该视图控制器时:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
                
        guard let vc = storyboard?.instantiateViewController(withIdentifier: "DetailsViewController") as? DetailsViewController else { return }
        vc.data = data[indexPath.row]
        self.navigationController?.pushViewController(vc, animated: true)
    }

现在您可以在 DetailsViewController 上使用该数据,从json响应中提取所需的任何信息:
class DetailsViewController: UIViewController {

    ...

    override viewDidLoad() {
        super.viewDidLoad()
        let title = data["title"]
        ...
    }

}

在这一行上,它说无法将类型为“JSON”的值分配给类型为“ViewController”的变量“vc”:vc.data = data[indexPath.row] - Jacob
@Jacob 我更新了我的答案,在 DetailsViewController 上使用了 var data: JSON? - Jobert
我很感激,但是在DetailsViewController中,我也遇到了这个问题:在这一行上找不到类型为“JSON”的范围 var data: JSON? - Jacob
1
@Jacob,你从哪里得到了JSON类型?是SwiftyJSON吗?也许你在DetailsViewController中缺少对它的导入(import SwiftyJSON)。 - Jobert

0
你将alamofire的结果传递给"data"变量。因此,在向另一个VC传递该值时,应使用"data"。在您的情况下,可以这样做;
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let vc = storyboard?.instantiateViewController(withIdentifier: "DetailsViewController") as? DetailsViewController
        vc?.imageView = UIImage(named: url)
        let item = data[indexPath.row]
        vc?.AdTitle = item["title"].string
        self.navigationController?.pushViewController(vc!, animated: true)

    }

0

好的

**

    if let json = response.data {
   let JSON22 = json as! NSDictionary
                            do{
                                let jsonData = try JSON(data: JSON22)
                                self.data = jsonData.arrayValue
                                self.tableView.reloadData() // we are already on the main thread
                                //print("DATA PARSED: \(jsonData)")
                            }
                            catch {
                                print("JSON Error", error)
                            }

**

如果您想从Controller1传递数据到Controller2
Controller1中。
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)   {

         let item = data[indexPath.row]

         let vc = storyboard?.instantiateViewController(withIdentifier: "DetailsViewController") as? DetailsViewController
         vc!.dictGetData = item
         self.navigationController?.pushViewController(vc!, animated: true)
    }

Controller2中,
创建一个字典变量。
var dictGetData:NSDictionary!

然后在视图加载时打印字典

override func viewDidLoad() {
        super.viewDidLoad()

       print(dictGetData as Any)
}

在这行代码上,我得到了“无法将类型为'JSON'的值分配给类型为'NSDictionary'的问题”:vc!.dictGetData = item - Jacob
我编辑了我的回答,请检查。 - Dishant Rajput

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接