如何将数据从基于 plist 的 UITableView 传递到 UIViewController
Posted
技术标签:
【中文标题】如何将数据从基于 plist 的 UITableView 传递到 UIViewController【英文标题】:How to pass data from plist based UITableView to UIViewController 【发布时间】:2015-11-08 06:27:48 【问题描述】:我有一个带有原型单元的TableViewController
。它填充了来自 .plist
的标签和 ImageViews 以及一个字典数组。如何将此数据传递给详细视图?详细视图是UIViewController
子类。我已经尝试过不同教程中的方法,但我找不到合适的组合来使它起作用。代码示例会很棒!
import UIKit
class OurMenuViewController: BaseViewController
@IBOutlet weak var tableView: UITableView?
var menuItems: [MenuItem] = []
override func viewDidLoad()
super.viewDidLoad()
menuItems = MenuItemsManager.sharedManager.loadData()
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// MARK: - UITableViewDataSource
extension OurMenuViewController: UITableViewDataSource
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return menuItems.count
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell: MenuItemTableViewCell = tableView.dequeueReusableCellWithIdentifier("menuItemCell") as! MenuItemTableViewCell
let item = menuItems[indexPath.row]
//display data from MenuItems.plist
cell.menuItemNameLabel?.text = item.name
cell.ingredientsItemLabel?.text = item.ingredients
cell.priceItemLabel?.text = item.price
cell.menuItemImageView?.image = UIImage(named: item.image)
if let discount = item.discount
cell.discountLabel?.text = discount
cell.discountView?.hidden = false
else
cell.discountView?.hidden = true
cell.backgroundColor = UIColor.clearColor()
return cell
我创建了另一个名为DetailViewController
的viewController,所以在DetailViewController
中我想显示OurMenuViewController
中有关食物的所有详细信息,但我无法通过segue 传递数据,可能是因为缺乏知识;(可以请您帮我如何将数据从MenuItems.plist
(OurMenuViewController
) 传递到DetailViewController
?
import UIKit
class DetailViewController: UIViewController
@IBOutlet weak var itemNameLabel: UILabel?
@IBOutlet var itemImageView: UIImageView?
private var menuItems: [MenuItem] = []
//var restaurantImage:String!
override func viewDidLoad()
super.viewDidLoad()
menuItems = MenuItemsManager.sharedManager.loadData()
itemImageView!.image = ?????????????????????
// Do any additional setup after loading the view.
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
【问题讨论】:
【参考方案1】:首先在您的故事板中,您需要将 Storyboard Segue Identifire 设置为 SIDDetail
,例如
其次,您需要在 DetailViewController
类中创建 setData
方法,例如:
class DetailViewController: UIViewController
var currentItem: MenuItem?
...
func setData(item: MenuItem)
currentItem = item
...
然后你需要像这样覆盖OurMenuViewController
中的prepareForSegue
方法:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
if let identifier = segue.identifier
if identifier == "SIDDetail"
if let cell = sender as? MenuItemTableViewCell
if let index = self.tableView.indexPathForCell(cell)?.row
let detailViewController = segue.destinationViewController as! DetailViewController
detailViewController.setData(menuItem[index])
【讨论】:
以上是关于如何将数据从基于 plist 的 UITableView 传递到 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章
如何将嵌套的 Array/JSON 字符串存储在 .plist 文件中?