使用 prepareForSegue 时的 indexPathForSelectedRow 错误

Posted

技术标签:

【中文标题】使用 prepareForSegue 时的 indexPathForSelectedRow 错误【英文标题】:Wrong indexPathForSelectedRow when using prepareForSegue 【发布时间】:2015-09-22 13:18:36 【问题描述】:

我正在尝试用我的 mysql 数据库中的一些产品(使用 php POST 文件)填充 tableView,目前一切正常,但是当我选择“单元格”时,会触发 prepareForSegue,但 indexPathForSelectedRow是错误的,所以它显示的是不同的产品。

这是我的完整代码,我希望你能告诉我一些事情,因为我不知道为什么会这样,我尝试了很多东西,但我没有选择......!

TableViewController.swift

import UIKit

class ListadoBuscarResultadosTableViewController: UITableViewController 

var option: String = ""

var productos = [Producto]()

var refreshControl2:UIRefreshControl!

var imageCache = [String:UIImage]()

override func viewDidLoad() 

    super.viewDidLoad()

    requestPost()

    title = self.option

    tableView.allowsMultipleSelection = true

    tableView.scrollsToTop = true

    self.tableView.reloadData()


override func viewWillAppear(animated: Bool) 
    super.viewWillAppear(animated)

    self.navigationController?.hidesBarsOnSwipe = false
    self.navigationController?.setNavigationBarHidden(false, animated: true)


func refresh(sender:AnyObject) 

    requestPost()

    self.refreshControl2.endRefreshing()


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


// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    // Return the number of sections.
    return 1


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    // Return the number of rows in the section.
    return productos.count


override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) 

    // Define the initial state (Before the animation)
    cell.alpha = 0.25

    // Define the final state (After the animation)
    UIView.animateWithDuration(1.0, animations:  cell.alpha = 1 )


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    // try to reuse cell
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! BuscarCellTableViewCell

    cell.selectionStyle = .None

    //cell.nombre.text = productos[indexPath.row].nombre
    //cell.marca.text = productos[indexPath.row].marca

    //println(cell.nombre.text)

    // get the deal image
    let currentImage = productos[indexPath.row].imagen
    let unwrappedImage = currentImage
    var image = self.imageCache[unwrappedImage]
    let imageUrl = NSURL(string: productos[indexPath.row].imagen)

    // reset reused cell image to placeholder
    cell.imagen.image = UIImage(named: "")

    // async image
    if image == nil 

        let request: NSURLRequest = NSURLRequest(URL: imageUrl!)

        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: (response: NSURLResponse!,data: NSData!,error: NSError!) -> Void in
            if error == nil 

                image = UIImage(data: data)

                self.imageCache[unwrappedImage] = image
                dispatch_async(dispatch_get_main_queue(), 
                    cell.imagen.image = image
                    cell.nombre.text = self.productos[indexPath.row].nombre
                    cell.marca.text = self.productos[indexPath.row].marca
                )
            
            else 
                cell.nombre.text = self.productos[indexPath.row].nombre
                cell.marca.text = self.productos[indexPath.row].marca
            
        )
    

    else 
        cell.imagen.image = image
        cell.nombre.text = self.productos[indexPath.row].nombre
        cell.marca.text = self.productos[indexPath.row].marca
    

    return cell



func requestPost () 

    let request = NSMutableURLRequest(URL: NSURL(string: "http://www.web.es/productos_by_category.php")!)
    request.HTTPMethod = "POST"
    let postString = "category="+option
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) 
        data, response, error in

        if error != nil 
            //println("error=\(error)")
            return
        

        let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)!
        // JSON RESULTADO ENTERO
        //println("responseString = \(responseString)")

        self.productos = self.parseJsonData(data)

        // Reload table view
        dispatch_async(dispatch_get_main_queue(), 
            self.tableView.reloadData()
        )
    
    task.resume()


func parseJsonData(data: NSData) -> [Producto] 
    var productos = [Producto]()
    var error:NSError?

    let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as? NSDictionary

    // Return nil if there is any error
    if error != nil 
        println(error?.localizedDescription)
    

    // Parse JSON data
    let jsonProductos = jsonResult?["lista_productos"] as! [AnyObject]
    for jsonProducto in jsonProductos 

        let producto = Producto()
        producto.nombre = jsonProducto["nombre"] as! String
        producto.imagen = jsonProducto["imagen"] as! String
        producto.marca = jsonProducto["marca"] as! String
        producto.distribuidor = jsonProducto["distribuidor"] as! String
        producto.linea = jsonProducto["linea"] as! String
        producto.precio = jsonProducto["precio"] as! String

        productos.append(producto)
    

    return productos


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) 
    if segue.identifier == "verProducto" 
        if let indexPath = self.tableView.indexPathForSelectedRow() 
            let destinationController = segue.destinationViewController as! MarcaProductoViewController
            //println(productos[indexPath.row].nombre)
            println(indexPath)
            destinationController.nombre = productos[indexPath.row].nombre
        
    

提前致谢,

问候。

【问题讨论】:

试试if segue.identifier == "verProducto" if let indexPath = tableView.indexPathForCell(sender as! BuscarCellTableViewCell) var detailsVC = segue.destinationViewController as! MarcaProductoViewController 您能否将其发布为“答案”,因为它有效,我想将其标记为解决方案。非常感谢@EICaptain 好的...很高兴它有帮助:) 【参考方案1】:

试试这个方法……

 if segue.identifier == "verProducto"  
       if let indexPath = tableView.indexPathForCell(sender as! BuscarCellTableViewCell)    
           var detailsVC = segue.destinationViewController as! MarcaProductoViewController  
        
 

【讨论】:

感谢您的回答!您能否解释一下为什么 OP 问题中的方法不起作用?我在几个教程中看到过。

以上是关于使用 prepareForSegue 时的 indexPathForSelectedRow 错误的主要内容,如果未能解决你的问题,请参考以下文章

将选项卡栏控制器嵌入导航控制器时的 prepareForSegue

将视图控制器分配给 prepareForSegue 中的变量时的 Swift EXC_BREAKPOINT

使用 prepareForSegue 设置方法值

使用导航控制器在“prepareForSegue”中设置数据

Swift:如何在 UICollectionViewCell 中使用“prepareForSegue”?

了解使用 HybridAuth 时的 base_url 参数