2015-11-13 5 views
0

У меня есть два ViewControllers. Для первого ViewController он отображает мои данные массива в таблице. Я хочу получить indexPath выбранной ячейки и передать эти данные другому ViewController.Передача значения выбранной ячейки в другую ViewController

В моей первой ViewController

import UIKit 

class ViewController: UIViewController, UITableViewDataSource { 
var nameList = [NameManager]() 

    @IBOutlet weak var NameTable: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     NameTable.dataSource = self 
     GetData() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    func GetData(){ 
     let session = NSURLSession.sharedSession() 
     let request = NSMutableURLRequest(URL: NSURL(string: "http://www.json-generator.com/api/json/get/bPfifKWNaq?indent=2")!) 
     request.HTTPMethod = "GET" 

     let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in 

      if let error = error { 
       print(error) 
      } 
      if let data = data{ 
       do{ 
        let resultJSON = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions()) 
        let resultArray = resultJSON as? NSArray 
        for jsonObjectString in resultArray!{ 
         let code = jsonObjectString["code"] as! String 
         let name = jsonObjectString["name"] as! String 
         let description = jsonObjectString["description"] as! String 
         self.nameList.append(NameManager(code: code, name: name, description: description)) 
        } 
        self.nameList.count 
        dispatch_async(dispatch_get_main_queue(), { 
         self.NameTable.reloadData() 
        }) 
       }catch _{ 
        print("Received not-well-formatted JSON") 
       } 

      } 
      if let response = response { 
       let httpResponse = response as! NSHTTPURLResponse 
       print("response code = \(httpResponse.statusCode)") 
      } 

     }) 
     task.resume() 

    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ 
     let count = nameList.count 
     return count 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ 
     let myCell = NameTable.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as UITableViewCell 

     myCell.textLabel?.text = nameList[indexPath.row].name 
     myCell.detailTextLabel?.text = nameList[indexPath.row].description 

     return myCell 
    } 

В моей второй ViewController, который также еще один класс, я хочу, чтобы захватить indexPath того, что был выбран. Используя значение индекса, я ищу свой массив и передаю этот конкретный объект следующему классу. У меня нет кодов для этого, так как я не знаю, как это работает.

+0

Как вы можете отображать оба контроллера? Вы показываете второй после выбора ячейки в первом? – Eluss

+0

Используя контроллер навигации, щелкнув по ячейке, он приведет меня к следующему контроллеру. Оба используют разные классы. –

ответ

0

Вы можете создать свойство за пределами своего класса, а затем установить его в методе cellForRowAtIndexPath. Доступ к этому свойству можно получить во втором контроллере. Вам нужно посмотреть на метод tableview didSelectRowAtIndexPath, так как это будет ваше свойство для выбранной ячейки.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
appDelegate().index = indexPath.row 
} 

Я сделал супер простой project on github показаны два способа создания собственности вне рамок вашего контроллера представления. Один из способов - создать переменную в пределах AppDelegate для доступа через одноэлементный, другой - файл Globals.swift.

Надеюсь, это поможет!

+0

Извините, я новичок в быстром программировании. Поэтому, создав свойство и установив значение в 'didSelectRowAtIndexPath', в моем другом классе, я должен также создать экземпляр нового объекта моего предыдущего класса, который при извлечении он вернет мне как null? –

+0

Я обновил этот проект на github (см. Ссылку выше), чтобы быть простой демонстрацией передачи значения от одного контроллера представления к другому. НТН – joeh

0

Если вы хотите передать значения контроллеру, который появляется после нажатия на ячейку, использование синглтона не будет элегантным способом. Если вы используете раскадровки, вам нужно использовать «подготовиться к segue». Вы реализуете метод в классе, который обрабатывает передачу и устанавливает все свойства в другом контроллере представления.

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { 
    if (segue.identifier == "SecondVC") { 
     // set properties 
    } 
} 
Смежные вопросы