Обновление меток на secondViewController данными из tableViewController

У меня есть tableView в качестве начального контроллера и несколько меток во secondViewController. Когда я создаю ячейку с нужными мне данными, идея состоит в том, чтобы отобразить эти данные в метках secondViewController. Все работает нормально, НО метки во втором VC обновляются только тогда, когда я нажимаю кнопку «Назад», чтобы вернуться к представлению таблицы и снова выбрать строку. Как я могу обновить данные, отображаемые во втором VC, при первом нажатии в ячейке tableview?

enter code here

класс ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var tableView: UITableView!

var titles = [String]()
var subjects = [String]()
var previews = [String]()
var textFieldsText = [UITextField!]()

var selectedTitle: String!
var selectedSubject: String!
var selectedPreview: String!


override func viewDidLoad() {
    super.viewDidLoad()


    navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "addTitle")


}

override func viewDidAppear(animated: Bool) {
    tableView.reloadData()
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
    cell.textLabel?.text = titles[indexPath.row]
    cell.detailTextLabel?.text = subjects[indexPath.row]

    return cell
}

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

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    selectedTitle = self.titles[indexPath.row]
    selectedSubject = self.subjects[indexPath.row]
    selectedPreview = self.previews[indexPath.row]
    tableView.reloadData()

}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showPreview" {
        let dataToPass = segue.destinationViewController as! previewViewController
        dataToPass.titlesString = selectedTitle
        dataToPass.subjectsString = selectedSubject
        dataToPass.previewsString = selectedPreview

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

func addTitle()  {
    let addAlert = UIAlertController(title: "New Title", message: "Add new title, subject and a short preview", preferredStyle: .Alert)

        addAlert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))

        addAlert.addTextFieldWithConfigurationHandler {[unowned self] textField in
            textField.placeholder = "Add Title"
            textField.textAlignment = .Center
            self.textFieldsText.append(textField)
            }
        addAlert.addTextFieldWithConfigurationHandler { textField in
            textField.placeholder = "Add Subject"
            textField.textAlignment = .Center
            self.textFieldsText.append(textField)
            }
        addAlert.addTextFieldWithConfigurationHandler { textField in
            textField.placeholder = "Add Short Preview"
            textField.textAlignment = .Center
            self.textFieldsText.append(textField)
            }
        addAlert.addAction(UIAlertAction(title: "Done", style: .Default){ _ in
            self.titles.append(self.textFieldsText[0].text!)
            self.subjects.append(self.textFieldsText[1].text!)
            self.previews.append(self.textFieldsText[2].text!)
            self.tableView.reloadData()
            self.textFieldsText.removeAll()
            })



    presentViewController(addAlert, animated: true, completion: nil)

}

}

class previewViewController: UIViewController {
@IBAction func readButton(sender: UIButton) {
}
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var subjectLabel: UILabel!
@IBOutlet weak var shortPreviewLabel: UITextView!

var titlesString: String!
var subjectsString: String!
var previewsString: String!



override func viewDidLoad() {
    super.viewDidLoad()
    navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Save, target: self, action: "saveChanges")

    titleLabel.text = titlesString
    subjectLabel.text = subjectsString
    shortPreviewLabel.text = previewsString

}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showDetail" {

        let dataToDetail = segue.destinationViewController as! detailViewController
        dataToDetail.textViewString = self.previewsString

    }
}

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

person Dusan Juranovic    schedule 12.12.2015    source источник
comment
Сначала введите код. Вы имеете в виду кнопку «Назад» второго VC?   -  person Mejdi Lassidi    schedule 12.12.2015
comment
Пожалуйста, добавьте свой код.   -  person Keyur Hirani    schedule 12.12.2015
comment
Я добавил код, спасибо   -  person Dusan Juranovic    schedule 12.12.2015


Ответы (1)


Если я правильно понял ваш вопрос, это может помочь:

используйте это didSelectRowAtIndexPath:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    performSegueWithIdentifier("showPreview", sender: indexPath.row)
}

используйте это prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showPreview" {
        let destinationViewController = segue.destinationViewController as! previewViewController
        if let index = sender as? Int {
            destinationViewController.titlesString = self.titles[index]
            destinationViewController.subjectsString = self.subjects[index]
            destinationViewController.previewsString = self.previews[index]
        }
    }
}

И вам нужен переход от ViewController к previewViewController под названием "showPreview". Как это:

инструкция по переходу

person Wiingaard    schedule 12.12.2015
comment
Это наполовину сработало, теперь данные отображаются, но у меня есть два анимационных перехода, сначала пустой, а затем тот, в котором данные следуют за первым в последовательности. У меня была эта проблема раньше, поэтому код выглядит так, как сейчас. Я предполагаю, что prepareForSegue автоматически отображает пустой переход, за которым следует обновленный переход из didSelectRowAtIndexPath. - person Dusan Juranovic; 12.12.2015
comment
У вас должен быть только один переход в раскадровке под названием showPreview. Удалите те, которые у вас уже есть, и повторите попытку. Используйте переход непосредственно от контроллера представления к другому контроллеру представления, см. скриншот, который я добавил... - person Wiingaard; 12.12.2015
comment
Большое спасибо, Рапсефар, это сработало. Просто любопытно, у меня был только один предварительный просмотр segue show. Почему это не сработало с переходом, который у меня был, который был таким же, как тот, которым я его заменил? - person Dusan Juranovic; 12.12.2015
comment
Хм, да, это загадка. Вы, должно быть, сделали небольшую ошибку с первыми переходами, мне трудно сказать, не зная точно, что вы сделали.. Но пожалуйста.. Я рад помочь :) - person Wiingaard; 12.12.2015
comment
Да, действительно загадка, но теперь, когда я думаю об этом, я играл с типами переходов в раскадровке. В конце концов я оставил его как Push, но это могло все испортить. В любом случае, спасибо за разъяснение :) Я бы проголосовал за ваш ответ, но у меня недостаточно баллов :) Я сделаю это, когда найду. - person Dusan Juranovic; 12.12.2015
comment
Не за что :) Вы должны принять мой ответ как правильный, нажав галочку. - person Wiingaard; 12.12.2015
comment
Ну вот :) ненавижу быть новичком :) - person Dusan Juranovic; 12.12.2015