Swift - 关于动态TableCell的争论

时间:2014-10-10 16:07:04

标签: ios uitableview swift segue

我快速学习,并且在触摸TableViewCell时尝试触发segue时出现问题,这应该将url传递给第二个视图,暂时只显示它一个标签。 我动态创建(我已经看过人们使用编程方式,这可能是正确的词)每个单元格,因此,在故事板中我没有任何对象链接到另一个视图,除了视图本身..那就是我做的。 所以我将第一个视图控制器连接到第二个,并添加了执行segue的代码。

我不确定它是否正确,我的知识来自那些没有准确解释我想做什么的教程。

那里有两个视图的代码。

第一个视图

    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)

    }

第二种观点

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

        }
    }
}

感谢。

1 个答案:

答案 0 :(得分:2)

要将任何数据传递给第二个视图控制器,您需要在第一个视图控制器中实现prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)方法,并通过segue.destinationViewController对象将任何数据传递给第二个视图控制器。

例如

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

        }
    }

在第二个视图控制器中获取数据的代码

override func viewDidLoad() {
    super.viewDidLoad()

    self.label.text = self.data
}

必须将数据变量定义为第二个视图控制器的属性。