DeepVinicius
DeepVinicius

Reputation: 65

Swift - Segue on Dynamic TableCell

I'm learning swift, and i'm having problems trying to fire a segue when a TableViewCell is touched, which is supposed to pass an url to a second view that for the moment just a displays it in a label. i Dynamically create ( i've seen people use Programmatically, which is probably the right word) every single Cell, so, in the storyboard i don't have any object to link to another view except the view itself... and that's what i did. So i connected the first view controller to the second, and added the code to perform the segue.

i'm not sure if it's right, my knowledge comes from tutorials that didn't exactly explain what i wanted to do.

down there there's the code of the two views.

first view

    import UIKit

protocol sendInfoDelegate{

    func userDidEnterInfo( WhichInfo info : String)

}

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

var tableData = []
@IBOutlet weak var redditListTableView: UITableView!
var selectedCellURL : String?
var delegate : sendInfoDelegate? = nil



override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    // change the link to change the json source

    getRedditJSON("http://www.reddit.com/.json")
}

//
//Creates a connection via a task (networktask) then parses the json
//
func getRedditJSON(whichReddit : String){
    let mySession = NSURLSession.sharedSession()
    let url: NSURL = NSURL(string: whichReddit)
    let networkTask = mySession.dataTaskWithURL(url, completionHandler : {data, response, error -> Void in
        var err: NSError?
        var theJSON = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSMutableDictionary
        let results : NSArray = theJSON["data"]!["children"] as NSArray
        dispatch_async(dispatch_get_main_queue(), {
            self.tableData = results
            self.redditListTableView.reloadData()
        })
    })
    networkTask.resume()
}

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

//needs to be implemented

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

//creates the whole table

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "MyTestCell")
    let redditEntry : NSMutableDictionary = self.tableData[indexPath.row] as NSMutableDictionary
    cell.textLabel?.text = redditEntry["data"]!["title"] as? String
    cell.detailTextLabel?.text = redditEntry["data"]!["author"] as? String
    return cell
}

// action to be taken when a cell is selected
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let redditEntry : NSMutableDictionary = self.tableData[indexPath.row] as NSMutableDictionary
    self.selectedCellURL = redditEntry["data"]!["url"] as? String
    self.performSegueWithIdentifier("passInfo" , sender: indexPath)
    println(self.selectedCellURL!)

    if delegate != nil {
        let information:String = self.selectedCellURL!
        println("ciao")
        delegate?.userDidEnterInfo(WhichInfo: information)
        self.navigationController?.popViewControllerAnimated(true)

    }

second view

import UIKit




class WebPageController : UIViewController, sendInfoDelegate {


    var infoFromSVC: String?

    @IBOutlet weak var labelVC: UILabel!


    func userDidEnterInfo(WhichInfo info: String) {
        self.infoFromSVC = info
        labelVC.text = infoFromSVC

    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

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

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "passInfo"{
            let firstVController : ViewController = segue.destinationViewController as ViewController
            firstVController.delegate = self

        }
    }
}

Thanks.

Upvotes: 4

Views: 7238

Answers (1)

Sergey  Pekar
Sergey Pekar

Reputation: 8745

To pass any data to second view controller you need to implement prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) method in your first view controller and here pass any data to your second view controller through segue.destinationViewController object.

for example

// this method must be in first view controller
 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "passInfo" {
            var secondViewController : SecondViewController = segue.destinationViewController as SecondViewController

            var indexPath = self.tableview.indexPathForSelectedRow() //get index of data for selected row      

           secondViewController.data = self.dataArray.objectAtIndex(indexPath.row) // get data by index and pass it to second view controller

        }
    }

The code for getting data in second view controller

override func viewDidLoad() {
    super.viewDidLoad()

    self.label.text = self.data
}

The data variable must be defined as a property of your second view controller.

Upvotes: 2

Related Questions