2015-08-27 3 views
2

Я пытаюсь получить indexPath.row, который пользователь нажал, а затем проверить с моим массивом, чтобы вернуть строку из этого indexPath.row, а затем отправить строку с помощью prepforSegue .... Но это не работает. Я думаю, что программа запускает prepForSegue перед didselectRowatIndexPath ... Как я могу это сделать?Как я могу запустить prepareForSegue After didSelectRowAtIndexPath?

Мой код:

import UIKit 
import Parse 


class CategoriaTableViewController: UITableViewController { 

var queryArray: [PFObject] = [PFObject]() 
var escolha = 5 

override func viewDidLoad() { 
    super.viewDidLoad() 


    var query = PFQuery(className:"Categorias") 
    //querycomlocalidade 
    query.findObjectsInBackgroundWithBlock { 
     (objects: [AnyObject]?, error: NSError?) -> Void in 

     if error == nil { 
      println("Successfully retrieved \(objects!.count) Restaurantes.") 
      if let _objects = objects as? [PFObject] { 

       self.queryArray = _objects 
       self.tableView.reloadData() 

      } 
     } else { 
      println("Error: \(error!) \(error!.userInfo!)") 
     } 
    } 


} 

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

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Potentially incomplete method implementation. 
    // Return the number of sections. 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete method implementation. 
    // Return the number of rows in the section. 
    return queryArray.count 
} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> CategoriaTableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("ceculaCategoria", forIndexPath: indexPath) as! CategoriaTableViewCell 


    let categoria = queryArray[indexPath.row] as! PFObject 

    //Insere texto 
    cell.tituloCecula.text = categoria.objectForKey("nome") as! String 


    //Insere imagens no tableview 
    if let categoriaImagem = categoria.objectForKey("imagem") as? PFFile { 

     categoriaImagem.getDataInBackgroundWithBlock { (imageData: NSData?, error: NSError?) -> Void in 
      if (error == nil) { 
       cell.imagemCecula.image = UIImage(data:imageData!)    } 
     } 
    } 


    return cell 
} 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    escolha = indexPath.row 

} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    var detailScene = segue.destinationViewController as! ListaTableViewController 

    if let indexPath = self.tableView.indexPathForSelectedRow() { 
     let row = Int(indexPath.row) 

     let categoriaEscolhida = queryArray[escolha] as PFObject 

     //Insere texto 

     detailScene.categoria = categoriaEscolhida.objectForKey("nome") as! String 



    } 

} 



} 
+2

Что делать, если вы игнорируете 'escolha 'и использовать' queryArray [row] '? –

+0

Таким образом, как я узнаю, какую строку он выбрал? –

+0

Ну ... я не знаю, как, но кажется, что он работает. Как это возможно? :) Строка содержит строку, которую он нажал? –

ответ

4

Если вы связали SEGUE непосредственно из вашей ячейки в раскадровка затем didSelectRowAtIndexPathне будет выполняться до того, как будет запущен сеанс.

Что вы можете сделать, это создать segue путем перетаскивания Ctrl из объекта контроллера вида в раскадровке на сцену назначения и предоставления идентификатора segue, как и для любого другого сеанса. Удалите segue из вашей ячейки.

Теперь вы можете вызвать performSegueWithIdentifier, чтобы вызвать SEGUE и передать объект, который был выбран в качестве sender

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    // tableView.deselectRowAtIndexPath(indexPath) // Optionally deselect the row for a cleaner appearance 
    self.performSegueWithIdentifier("mySegueIdentifier", sender: queryArray[indexPath.row]) 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    if let detailScene = segue.destinationViewController as? ListaTableViewController {   
     let categoriaEscolhida = sender as! PFObject 
     detailScene.categoria = categoriaEscolhida.objectForKey("nome") as! String 

    }  
} 
1

Вам нужно создать SEGUE между двумя контроллерами зрения и запустить его вручную:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    escolha = indexPath.row 
    self.performSegueWithIdentifier("push", sender: self) 
} 
0
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    escolha = indexPath.row 
    self.performSegueWithIdentifier("push", sender: self) 
} 

В комплекте с ...

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:"push"]) { 
    // Code 
    } 
Смежные вопросы