0

I am writing an application that is going to contain a tableview that contains a list of days. When a day is clicked, I would like to display a page that contains information with text and a button that is unique to each day.

I was planning on creating a different view controller that would be specific to each day. However, I do not know how to pass the data from the tableview for each day to the specific view controller of the specific day selected.

David Makogon
  • 69,407
  • 21
  • 141
  • 189
Lindsay
  • 1
  • 1
  • 1
    Possible duplicate of [Pass data from View Controller to Child Controller in Swift](http://stackoverflow.com/questions/31284217/pass-data-from-view-controller-to-child-controller-in-swift) – shim Aug 03 '16 at 02:07

3 Answers3

3

You can use UITableView delegate method for click event in your tableview You need to implement UITableViewDelegate. For passing data to specific view controller you may want to use prepareForSegue function

var day = [1,2,3,4,5]
var selected_day : Int = 0
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
}

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

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("yourcellidentifier") as! yourtableViewCell
        cell.labelday.text = self.day[indexPath.row]// just sample
        return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        //this method will be called when you click 1 of the row from tableview
        self.selected_day = self.day[indexPath.row]
        self.performSegueWithIdentifier("ToYourSpecificViewController", sender: self) // you have to link with your table view controller and your specific view controller with an identifier.  
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
         if segue.destinationViewController is YourSpecificViewController{
            let vc = segue.destinationViewController as! YourSpecificViewController
            // In YourSpecificViewController, you also need to declare a variable name called selected_day to catch 
            vc.selected_day = self.selected_day
         }
    }

Hope this help!

Rurouni
  • 963
  • 10
  • 31
  • Thank you so much! Do I have to do anything in my storyboard as well, or just this code? – Lindsay Aug 05 '16 at 02:59
  • 1
    you need to link this view controller and YourSpecifiViewController and set segue id, use it in here `self.performSegueWithIdentifier("ToYourSpecificViewController", sender: self)` – Rurouni Aug 05 '16 at 03:06
0

In the view controller with the table, implement the prepareforsegue() method:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

    let row = self.tableView.indexPathForSelectedRow?.row

    if segue.identifier == "Sunday" {
        let vc = segue.destinationViewController as! SundayViewController
        vc.myInt = dataModel[row!].theInt  // This changes depending on how your data is set up and whether you're grabbing the info from a text field, or what have you
    }

    else if segue.identifier == "Monday" {   
        let vc = segue.destinationViewController as! MondayViewController
        vc.myInt = dataModel[row!].theInt
        vc.someString = dataModel[row!].theString
    }
}

The days' view controllers would look like:

class SundayViewController: UIViewController {

    var myInt: Int?
    // etc
}

class MondayViewController: UIViewController {

    var myInt: Int?
    var someString: String?
    // etc
}
Shades
  • 5,568
  • 7
  • 30
  • 48
0

In your tableviewcontroller implement this code

class TableviewController: UITableViewController {

    var array : [DayObject]? = [DayObject(day: "Sunday", daytext: "SundayText"),DayObject(day: "Monday", daytext: "MondayText"),DayObject(day: "tuesday", daytext: "TuesdayText"),DayObject(day: "Wednesday", daytext: "WednesdayText")]
    var object: DayObject?

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

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }
}

extension TableviewController {


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

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell")
        cell?.textLabel?.text = array![indexPath.row].day
        return cell!
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        object =  array![indexPath.row]
        performSegueWithIdentifier("NVC", sender: self)

    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "NVC" {
            let dvc = segue.destinationViewController as? ViewController2
            dvc!.object = object
        }
    }

}

and make a datamodel as below:

import UIKit
class DayObject: NSObject {

    var day: String!
    var daytext: String!


    init(day: String, daytext: String) {
        self.day = day
        self.daytext =  daytext
    }
}

and in your view controller you can collect the object

class ViewController2: UIViewController {
    var object: DayObject!

    override func viewDidLoad() {
        super.viewDidLoad()
        print(object.daytext)
    }
}

By datamodel approach you dont have to make different view controllers for each day

happycoding :-)

Anil Kumar
  • 945
  • 7
  • 16