Swift xCode 6.4 - использование переменной, сгенерированной контроллером представления таблицы во втором контроллере представления
Я весь день гуглюсь, наверное, на простой вопрос, но я не понимаю его правильно. Надеюсь, кто-нибудь может мне помочь.
У меня есть контроллер таблицы просмотра с одной ячейкой прототипа, содержащей три пользовательских метки. Когда я запускаю приложение, контроллер табличного представления генерирует около 150 ячеек табличного представления с анализом содержимого в виде csv-файла.
Когда я нажму на одну из этих ячеек, пользователь будет перенаправлен через два контроллера второго представления, показывающий некоторый дополнительный инфотекст для выбора своей ячейки. В то же время, когда пользователь щелкает ячейку представления таблицы, переменная будет обновлена до соответствующего номера строки таблицы-представления (например, 150 для последней ячейки представления таблицы. Теперь я хочу использовать эту переменную в качестве справочного текста в тексте, показанном во втором просмотр контроллера.
Переменная в контроллере табличного представления - "rowSelectedFromList" и будет установлена следующим кодом:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var rowSelectedFromList: String
rowSelectedFromList = rowOfItems[indexPath.row].customlabel3!
println(rowSelectedFromList)
}
"Println" просто для проверки, работает ли он правильно и работает.
Вопрос в том, как я могу использовать переменную rowSelectedFromList во втором контроллере представления?
Спасибо за помощь, спасибо!
4 ответа
Код, который работает для меня, представляет собой смесь Phoen1xUK и глюка ответы. Я собрал их вместе и в итоге получил эту рабочую версию:
Для FirstViewController:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "SecondControllerSegue" {
if let indexPath = self.tableView.indexPathForSelectedRow() {
let rowSelectedFromList = rowOfItems[indexPath.row].customlabel3
(segue.destinationViewController as! SecondViewController).rowTransferedFromList = rowSelectedFromList
}
}
}
В SecondViewController я настроил переменную следующим образом:
var rowTransferedFromList: String!
Вы можете добавить свою собственную логику в prepareForSegue
как это:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let controller = segue.destinationViewController as? YourSecondController,
indexPath = tableView.indexPathForSelectedRow() {
controller.someVariable = rowOfItems[indexPath.row].customlabel3!
}
}
Замените YourSecondController именем класса для контроллера второго представления.
Не забудьте создать IBOutlet для вашего UITableView и назовите его tableView
,
Вы хотите, чтобы положить что-то в prepareForSegue
а также переменная в вашем втором контроллере представления. Итак, в вашем контроллере табличного представления:
var variableToPass: String!
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
variableToPass = rowOfItems[indexPath.row].customlabel3!.text
performSegueWithIdentifier("SecondControllerSegue", sender: nil)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "SecondControllerSegue" {
let destinationController = segue.destinationViewController as! SecondViewController
destinationController.passedVariable = variableToPass
}
}
И в вашем втором контроллере представления вы захотите добавить переменную, в которую будет передано значение:
var passedVariable: String!
Конечно, вы можете выбрать замену переменной любым типом, который вы хотите отправить:)
Хороший вопрос, если вы хотите решить эту проблему, пожалуйста, следуйте приведенному ниже коду:
class ViewController {
var cvDataArray = cells = NSMutableArray.new()
func viewDidLoad() {
super.viewDidLoad()
cvDataArray.enumerateObjectsUsingBlock({(obj: AnyObject, idx: Int, stop: Bool) in var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("")
cell.textLabel.text = obj["title"]
cells.addObject(cell)
})
tableView.reloadData()
}
func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cells.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
return cells.objectAtIndex(indexPath.row)
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var cell: UITableViewCell = cells.objectAtIndex(indexPath.row)
}
}