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,请参阅此答案的先前版本.
| 归档时间: |
|
| 查看次数: |
42969 次 |
| 最近记录: |