2014-10-10 10 views
5

Uczę się szybko i mam problemy z odpaleniem ruchu, gdy dotknie się TableViewCell, który ma przekazać adres URL do drugiego widoku, który na razie tylko wyświetla to na etykiecie. i Dynamicznie tworzyć (widziałem ludzi używają programowo, co jest prawdopodobnie właściwym słowem) w każdej pojedynczej komórce, więc w scenorysie nie mam żadnego obiektu do połączenia z innym widokiem z wyjątkiem samego widoku ... i to jest co ja zrobiłem. Więc podłączyłem pierwszy kontroler widoku do drugiego, i dodałem kod, aby wykonać segue.Swift - Segue na Dynamic TableCell

Nie jestem pewien, czy to prawda, moja wiedza pochodzi z samouczków, które nie wyjaśniały dokładnie, co chciałem zrobić.

tam jest kod z dwóch widoków.

pierwszy widok

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) 

    } 

Drugi pogląd

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 

     } 
    } 
} 

Dzięki.

Odpowiedz

2

Aby przekazać jakiekolwiek dane do drugiego kontrolera widoku, należy wdrożyć metodę prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) w swoim pierwszym sterowniku widoku, a następnie przekazać wszelkie dane do drugiego kontrolera widoku za pośrednictwem obiektu inspueViewestontroller.

np

// 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 

     } 
    } 

Kod dla pobierania danych w drugim kontrolerze widoku

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.label.text = self.data 
} 

Zmienna dane muszą być zdefiniowane jako własność drugiego kontrolera widoku.

+0

Jak można odzyskać właściwość danych drugiego kontrolera widoku od pierwszego? pierwszy kontroler widoku nie wie, jakie właściwości ma drugi kontroler widoku. – DeepVinicius

+1

Należy odrzucić element sterue.destinationViewController do kontrolera SecondView. Wprowadziłem potrzebne modyfikacje do mojej odpowiedzi –