【问题标题】:Swift - Segue on Dynamic TableCellSwift - 动态 TableCell 上的 Segue
【发布时间】:2014-10-10 16:07:03
【问题描述】:

我正在快速学习,当触摸 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

        }
    }
}

谢谢。

【问题讨论】:

    标签: ios uitableview swift segue


    【解决方案1】:

    要将任何数据传递给第二个视图控制器,您需要在您的第一个视图控制器中实现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
    }
    

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

    【讨论】:

    • 如何从第一个视图控制器中检索第二个视图控制器的数据属性?第一个视图控制器不知道第二个视图控制器有哪些属性。
    • 您需要将 segue.destinationViewController 转换为 SecondView 控制器。我对我的答案进行了必要的编辑
    猜你喜欢
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    相关资源
    最近更新 更多