Search code examples
iosuitableviewback-buttonreloaddata

Updating labels on secondViewController with data from tableViewController


I have a tableView as initial controller and few labels in secondViewController. When I create a cell with data I want, the idea is to display that data in the secondViewController labels. All works fine, BUT, the labels in the secondVC update only when I hit the back button, to go back to the table view and select the row again. How can I update the data displayed in the secondVC on the first tap in the tableview cell?

enter code here

class 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.
}

Solution

  • If I understand your question right, this may help:

    use this didSelectRowAtIndexPath:

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

    use this 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]
            }
        }
    }
    

    And you need to have a segue from ViewController to previewViewController called "showPreview". Like this:

    segue instruction