使用 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”中设置数据