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

时间:2015-02-04 06:49:09

标签: uitableview swift uiviewcontroller segue

我有一个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()

如何选择单元格的标签,然后将其传递给另一个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)
}

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

由于

4 个答案:

答案 0 :(得分: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
    }

}

如果你的视图控制器没有与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) 
}

答案 1 :(得分:22)

你问:

  

如何选择单元格的标签,然后将其传递给另一个ViewController?

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

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

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

顺便说一下,在这种情况下,你根本不需要UILabel方法。您只需要从表格视图单元格到目标场景的segue,为该segue提供唯一标识符(在我的示例中为didSelectRowAtIndexPath),然后实现prepare(for:sender:)

Details

或者,如果您的segue位于单元格和目标场景之间,您还可以使用override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let destination = segue.destination as? DetailsViewController { let selectedRow = tableView.indexPathForSelectedRow!.row destination.selectedValue = items[selectedRow] } } 的{​​{1}}:

sender

但这个想法是一样的。确定选择了哪一行,并从模型prepare(for:sender:)数组中检索信息。

以上是Swift 3.对于Swift 2.3,请参阅此答案的previous version

答案 2 :(得分:4)

好的..这是2天我一直在寻找答案,我怎么能保存所选的UITableViewCell标签文本数据并将该数据显示在另一个View Controller上的另一个标签上,该控制器将在点击后显示出来一个细胞。最后我完成了任务并取得了成功。这是使用Swift的完整代码。我正在使用Xcode 6.4。

第1步。

我有两个类分配给名为“iOSTableViewControllerClass.swift”的故事板视图控制器,它是一个表视图控制器和“iOSTutorialsViewControllerClass.swift”,它是一个普通的视图控制器。

第2步。

现在通过控制拖动故事板区域,从iOSTableViewControllerClass到iOSTutorialsViewControllerClass创建segue,然后从下拉菜单中选择“show”。根据下面的图像单击此突出显示的按钮并执行segue。

Make Segue by selecting this icon an control-drag to the other view Controller

第3步。

现在通过单击故事板选择segue并在Attributes Inspector上为其指定标识符。在这种情况下,我将其命名为“iOSTutorials”

Select Segue on the storyboard and name it

第4步。

现在,在此步骤中,在您的单元格和另一个视图控制器上放置一个标签,并在相应的类上创建它们的出口。  在我的情况下,那些是“@IBOutlet weak var iOSCellLbl:UILabel!”和“@IBOutlet weak var iOSTutsClassLbl:UILabel!”。

第5步。

在第一个Table View Controller Class上创建一个字符串类型变量。我这样做“var sendSelectedData = NSString()”也在第二个类上创建一个字符串类型变量。我这样做是“var SecondArray:String!”。

第6步。

现在我们准备好了。 这是第一类的完整代码 -

 // iOSTableViewControllerClass.swift

  import UIKit

  class iOSTableViewControllerClass: UITableViewController, UITableViewDataSource,UITableViewDelegate {

  // Creating A variable to save the text from the selected label and send it to the next view controller

  var sendSelectedData = NSString()

 //This is the outlet of the label but in my case I am using a fully customized cell so it is actually declared on a different class
@IBOutlet weak var iOSCellLbl: UILabel!

//Array for data to display on the Table View
var iOSTableData = ["Label", "Button", "Text Field", "Slider", "Switch"];
override func viewDidLoad() {
    super.viewDidLoad()

//Setting the delegate and datasource of the table view

    tableView.delegate = self
    tableView.dataSource = self

//Registering the class here
    tableView.registerClass(CustomTableViewCellClassiOS.self, forCellReuseIdentifier: "CellIDiOS")

//If your using a custom designed Cell then use this commented line to register the nib.
    //tableView.registerNib(UINib(nibName: "CellForiOS", bundle: nil), forCellReuseIdentifier: "CellIDiOS")
}

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

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // Return the number of sections.
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // Return the number of rows in the section.
    return iOSTableData.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let CellIDentifier = "CellIDiOS"

 //In this case I have custom designed cells so here "CustomTableViewCellClassiOS" is the class name of the cell
    var cell:CustomTableViewCellClassiOS! = tableView.dequeueReusableCellWithIdentifier(CellIDentifier, forIndexPath: indexPath) as? CustomTableViewCellClassiOS
    if cell == nil{
        tableView.registerNib(UINib(nibName: "CellForiOS", bundle: nil), forCellReuseIdentifier: CellIDentifier)
        cell = tableView.dequeueReusableCellWithIdentifier(CellIDentifier) as? CustomTableViewCellClassiOS

    }
 //Here we are displaying the data to the cell label
    cell.iOSCellLbl?.text = iOSTableData[indexPath.row]
    return cell
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    println("You selected cell #\(indexPath.row)!")

    // Get Cell Label text here and storing it to the variable
    let indexPathVal: NSIndexPath = tableView.indexPathForSelectedRow()!
    println("\(indexPathVal)")
    let currentCell = tableView.cellForRowAtIndexPath(indexPathVal) as! CustomTableViewCellClassiOS!;
    println("\(currentCell)")
    println("\(currentCell.iOSCellLbl?.text!)")
    //Storing the data to a string from the selected cell
    sendSelectedData = currentCell.iOSCellLbl.text!
    println(sendSelectedData)
//Now here I am performing the segue action after cell selection to the other view controller by using the segue Identifier Name
    self.performSegueWithIdentifier("iOSTutorials", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

//Here i am checking the Segue and Saving the data to an array on the next view Controller also sending it to the next view COntroller
    if segue.identifier == "iOSTutorials"{
//Creating an object of the second View controller
        let controller = segue.destinationViewController as! iOSTutorialsViewControllerClass
//Sending the data here
        controller.SecondArray = sendSelectedData as! String

 }

以下是第二类的完整代码..--

//  iOSTutorialsViewControllerClass.swift

import UIKit

class iOSTutorialsViewControllerClass: UIViewController {

//Creating the Outlet for the Second Label on the Second View Controller Class
@IBOutlet weak var iOSTutsClassLbl: UILabel!

//Creating an array which will get the value from the first Table View Controller Class
var SecondArray:String!

override func viewDidLoad() {
    super.viewDidLoad()

//Simply giving the value of the array to the newly created label's text on the second view controller
   iOSTutsClassLbl.text = SecondArray
}

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

}

答案 3 :(得分:1)

我是这样做的。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

 let selectedName = nameArray[indexPath.row]      

let newView: nextViewName = self.storyboard?.instantiateViewController(withIdentifier: "nextViewName") as! nextViewName

   newView.label.text = selectedValue
   self.present(newView, animated: true, completion: nil)



}