如何准备 segue 在我的 TableViewController 中加载不同的数组?

Posted

技术标签:

【中文标题】如何准备 segue 在我的 TableViewController 中加载不同的数组?【英文标题】:How do I prepare for segue to load different arrays in my TableViewController? 【发布时间】:2016-03-30 13:10:51 【问题描述】:

经过几天的挣扎,我不知道如何解决这个问题。我正在制作一个简单的餐厅应用程序。 foodMenuController 包含 2 个按钮,它们必须将不同的菜单数组加载到 tableViewController(午餐、早餐)中。为了定义应该加载的菜单,有人告诉我使用variable -> contentMode

在我的TableViewController 中,我将contentMode 设置为"0"。在我的foodMenuController 中,我使用了为segue 准备的标识符,将contentMode 设置为1(早餐)和2(午餐)。

现在的问题是我的表不知道它何时处于 contentMode 1 或 2,也不知道在何处以及如何编写代码来指示表在某个 contentMode 时加载不同的数组。我希望有人可以帮助我解决我在下面发布的代码。

import UIKit

class foodMenuController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
            let foodMenuController = segue.destinationViewController as! foodTableViewController

            if segue.identifier == "showBreakfast" 
                foodMenuController.contentMode = 1
             else if segue.identifier == "showBakery" 
                foodMenuController.contentMode = 2
            
        
    

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


import UIKit

class foodTableViewCell: UITableViewCell 

    @IBOutlet weak var foodItem: UILabel!
    @IBOutlet weak var foodDescription: UILabel!
    @IBOutlet weak var foodPrice: UILabel!

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
    

    override func setSelected(selected: Bool, animated: Bool) 
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    


import UIKit

class foodTableViewController: UITableViewController 

    // Content Mode Selection in menu
    var contentMode = 0

    // THIS SHOULD BE LOADED WHEN CONTENT MODE is "1" --> BREAKFAST
    var foodItems = ["Bread", "Coffee", "Nada"]
    var foodInfo = ["Good", "Nice", "Nothing"]
    var foodPrice = ["$1", "$100", "$12,40"]

    // THIS SHOULD BE LOADED WHEN CONTENT MODE IS "2" --> LUNCH
    var foodItems = ["Not bread", "Not Coffee", "Something"]
    var foodInfo = ["Not good", "Not nice", "Yes"]
    var foodPrice = ["$1", "$100", "$12,40"]


    override func viewDidLoad() 
        super.viewDidLoad()
    

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

    // Table view data source
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return foodItems.count
    

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cellIdentifier = "Cell"
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! foodTableViewCell

        cell.foodItem.text = foodItems[indexPath.row]
        cell.foodDescription.text = foodInfo[indexPath.row]
        cell.foodPrice.text = foodPrice[indexPath.row]

        return cell
    

【问题讨论】:

您在名为foodMenuController 的类中有一个名为foodMenuController 的变量,但该变量不是foodMenuController 类型。我建议清理您的命名(包括大写)以避免不必要的混淆。 【参考方案1】:

如下所示更改数组名称。

// THIS SHOULD BE LOADED WHEN CONTENT MODE is "1" --> BREAKFAST
let breakfastItems = ["Bread", "Coffee", "Nada"]
let breakfastInfo = ["Good", "Nice", "Nothing"]
let breakfastPrice = ["$1", "$100", "$12,40"]

// THIS SHOULD BE LOADED WHEN CONTENT MODE IS "2" --> LUNCH
let lunchItems = ["Not bread", "Not Coffee", "Something"]
let lunchInfo = ["Not good", "Not nice", "Yes"]
let lunchPrice = ["$1", "$100", "$12,40"]

var foodItems: [String] = []
var foodInfo: [String] = []
var foodPrice: [String] = []

现在检查 ViewWillAppear 中 contentMode 的值

override func viewDidLoad() 
    super.viewDidLoad()



override func viewWillAppear(animated: Bool) 
    super.viewWillAppear(true)
    switch (contentMode)
    case 1:
        foodItems = breakfastItem
        foodInfo = breakfastInfo
        foodPrice = breakfastPrice
    case 2:
        foodItems = lunchItem
        foodInfo = lunchInfo
        foodPrice = lunchPrice
    default:
        break
    
    tableView.reloadData()

这会将所需的商品、信息、价格数组复制到 foodItem、foodInfo 和 foodPrice 数组中。您的其余代码将正常工作,UITableView 将根据需要填充。

【讨论】:

谢谢!但是我究竟把 viewWillAppear 的代码放在哪里呢? 你必须override viewWillAppear 类的viewWillAppear 方法如图所示。 好的,代码已添加并且工作正常,但它没有将任何数据加载到 tableView 中......知道为什么吗? 检查FoodMenuControllerFoodTableViewControllerprepareForSegue方法中设置的值是否符合要求。或者你可以在switch中设置断点来查找执行的是哪个case。 我不确定您所说的“切换”是什么意思?我检查了segues,它们是正确的......它只是一直显示一个空白的Tableview..我从这里去哪里?还是我应该为此发布一个新问题?

以上是关于如何准备 segue 在我的 TableViewController 中加载不同的数组?的主要内容,如果未能解决你的问题,请参考以下文章

展开 segue 后,swift 2 搜索栏不会隐藏

为 segue 做准备没有按预期工作

如何在 segues 之间拆分、子字符串和排序字符串,使其正确显示在我的表中?

程序化嵌入 segue

准备 Segue 到 UITabBarController 选项卡

如何在准备中的 switch 语句中使用可选绑定(segue :)