Swift:将UITableViewCell标签传递给新的ViewController

Mar*_*rkP 19 uitableview uiviewcontroller segue swift

我有一个UITableView,它使用基于JSON调用的数据填充Cell.像这样:

var items = ["Loading..."]
var indexValue = 0

// Here is SwiftyJSON code //

for (index, item) in enumerate(json) {
    var indvItem = json[index]["Brand"]["Name"].stringValue
    self.items.insert(indvItem, atIndex: indexValue)
    indexValue++
}
self.tableView.reloadData()
Run Code Online (Sandbox Code Playgroud)

如何在选中单元格时获取单元格的标签,然后将其传递给另一个ViewController?

我设法得到:

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
    println("You selected cell #\(indexPath.row)!")

    // Get Cell Label
    let indexPath = tableView.indexPathForSelectedRow();
    let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as UITableViewCell!;

    println(currentCell.textLabel.text)
}
Run Code Online (Sandbox Code Playgroud)

我只是想弄清楚如何将它作为变量传递给下一个UIViewController.

谢谢

Zel*_* B. 23

在两个视图控制器之间传递数据取决于视图控制器如何相互链接.如果它们与segue链接,则需要使用performSegueWithIdentifier方法并覆盖prepareForSegue方法

var valueToPass:String!

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
    println("You selected cell #\(indexPath.row)!")

    // Get Cell Label
    let indexPath = tableView.indexPathForSelectedRow();
    let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as UITableViewCell!;

    valueToPass = currentCell.textLabel.text
    performSegueWithIdentifier("yourSegueIdentifer", sender: self)

}

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

    if (segue.identifier == "yourSegueIdentifer") {

        // initialize new view controller and cast it as your view controller
        var viewController = segue.destinationViewController as AnotherViewController
        // your new view controller should have property that will store passed value
        viewController.passedValue = valueToPass
    }

}
Run Code Online (Sandbox Code Playgroud)

如果您的视图控制器没有与segue链接,那么您可以直接从tableView函数传递值

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
    println("You selected cell #\(indexPath.row)!")

    // Get Cell Label
    let indexPath = tableView.indexPathForSelectedRow();
    let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as UITableViewCell!;
    let storyboard = UIStoryboard(name: "YourStoryBoardFileName", bundle: nil)
    var viewController = storyboard.instantiateViewControllerWithIdentifier("viewControllerIdentifer") as AnotherViewController
    viewController.passedValue = currentCell.textLabel.text
    self.presentViewController(viewContoller, animated: true , completion: nil) 
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*Rob 22

您询问:

如何在选中单元格时获取单元格的标签,然后将其传递给另一个ViewController?

我可能会建议将问题重新表述如下:"如何检索与所选单元格关联的数据并将其传递给另一个视图控制器?"

这可能听起来像是一回事,但这里有一个重要的概念区别.您真的不想从单元格标签中检索值.我们的应用程序采用MVC范例,因此当您想要将数据信息从一个场景传递到另一个场景时,您需要返回模型(items数组),而不是视图(text属性UILabel).

这是一个微不足道的例子,所以这种区别有点学术性,但随着应用程序变得越来越复杂,这种返回模型的模式变得越来越重要.来自单元格的字符串表示通常是实际模型对象的不良替代.而且,正如您将在下面看到的那样,从模型中检索数据同样容易(如果不是更容易),所以您应该这样做.

另外,didSelectRowAtIndexPath在这种情况下,你根本不需要一个方法.您只需要从表格视图单元格到目标场景的segue,给该segue一个唯一的标识符(Details在我的示例中),然后实现prepare(for:sender:):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destination = segue.destination as? DetailsViewController {
        let selectedRow = tableView.indexPathForSelectedRow!.row
        destination.selectedValue = items[selectedRow]
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您的segue位于单元格和目标场景之间,您还可以使用以下sender内容prepare(for:sender:):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destination = segue.destination as? DetailsViewController {
        let cell = sender as! UITableViewCell
        let selectedRow = tableView.indexPath(for: cell)!.row
        destination.selectedValue = items[selectedRow]
    }
}
Run Code Online (Sandbox Code Playgroud)

但这个想法是一样的.确定选择了哪一行,并从模型(items阵列)中检索信息.

以上是Swift 3.对于Swift 2.3,请参阅此答案的先前版本.