我有一个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。
由于
答案 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。
第3步。
现在通过单击故事板选择segue并在Attributes Inspector上为其指定标识符。在这种情况下,我将其命名为“iOSTutorials”
第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)
}