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)
    }
}
Другие вопросы по тегам