如何将数据从基于 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的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义数组保存/重新加载到 plist

如何将嵌套的 Array/JSON 字符串存储在 .plist 文件中?

如何将图像从 plist 加载到 UITableView?

如何将对象从 fetchedResultsController 到 Plist?

将数据从 plist 传递到 DetailView

iOS开发,如何替换plist这个数组下数据