如何更改 UItableview 的数据?

Posted

技术标签:

【中文标题】如何更改 UItableview 的数据?【英文标题】:how to change the data of UItableview? 【发布时间】:2016-09-17 14:01:07 【问题描述】:

我的应用程序中有一个包含 15 个项目的主菜单,每个项目都有 20 个项目的子菜单,我还将它们添加为图像数组(15 个图像数组,类似于餐厅菜单),所以当用户点击应用程序会将他带到子菜单的主菜单项中的 1 个,我已经创建了主菜单表视图问题是子菜单我是否必须为每个子菜单创建 15 个表视图!!??

有什么方法可以为子菜单创建 1 个表格视图并根据用户点击更改其数据

注意:我不想使用表格视图中的部分

任何想法将不胜感激

【问题讨论】:

认为您有两个选择,1. 为子菜单创建另一个视图控制器,这非常简单,就像您创建主菜单一样。 2.如果您愿意坚持使用相同的控制器并且只想创建子菜单,那么使用可扩展部分将是最好的方法,只需对手风琴视图进行一些研究。 【参考方案1】:

    需要两个 viewController 和一个 navigationController。一个用于主菜单,另一个用于子菜单。让它们成为 mainMenuViewController 和 subMenuViewController。每个控制器都包含一个 tableView。

    创建一个包含 15 个子菜单数据的 menuArray。每个子菜单都是一个数组。

    在 mainMenuViewController 的 didSelectRowAtIndexPath 中,如果用户在 tableView 中选择了一行,则将该数据传递到与所选行对应的 menuArray 中。

例如,如果用户选择第三行, 然后将 menuArray[3] 传递给 subMenuViewController。这里 indexPath.row = 3。

示例项目代码:

MenuViewController.swift:

import UIKit

class MenuViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

    @IBOutlet weak var menuTableView: UITableView!
    var  imagesArray: NSArray = []
    var  menuArray: NSArray = []
    var  subMenuDataArray: NSArray = []

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        menuTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
        imagesArray = ["soups.jpg","salads.jpg","starters.jpg","pizzas.jpg","burgers.jpeg"]

        menuArray = ["Soups","Salads","Starters","Pizzas","Burgers"]

        subMenuDataArray = [["Cream of broccoli","Cream of celery","Cream of tomato","Etrog","Gazpacho"],
                            ["Tuna salad","Urnebes","Waldorf salad"],
                            ["Kakori Kebabs","Stir Fried Chilli Chicken"," Microwave Paneer Tikkas","Aloo and Dal ki Tikki","Cheese Balls","Bhuna Masala Chicken Wings"],
                            ["Cheese Pizzas","Chicken Pizzas","Masala Pizzas","Double Cheese Pizzas","Herbal Pizzas"],
                            ["Luger Burger","Le Pigeon Burger","The Company Burger","Dyer’s Deep-Fried Burger","The Lola Burger","Cheeseburger","Raw Steak Tartare Burger","Buckhorn Burger"]]

    

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

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int

        return imagesArray.count

    

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
        return 70

    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell

        let  menuTableViewCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
        let cellImageView: UIImageView = UIImageView.init()
        cellImageView.frame = CGRectMake(10, 10, 50, 50)
        cellImageView.image =  UIImage(named: imagesArray.objectAtIndex(indexPath.row) as! String)
        menuTableViewCell.contentView.addSubview(cellImageView)

        let  menuLabel: UILabel = UILabel.init(frame: CGRectMake(70, 10, 200, 25))
        menuLabel.text = menuArray.objectAtIndex(indexPath.row) as? String
        menuTableViewCell.contentView.addSubview(menuLabel)


        return menuTableViewCell
    

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

        let subMenuViewController: SubMenuViewController = storyboard!.instantiateViewControllerWithIdentifier("SubMenuViewControllerID") as! SubMenuViewController
        subMenuViewController.currentSubMenuArray = subMenuDataArray.objectAtIndex(indexPath.row) as! NSArray
        navigationController?.pushViewController(subMenuViewController, animated: true)


    



SubMenuViewController.swift:

import UIKit

class SubMenuViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

    @IBOutlet weak var subMenuTableView: UITableView!
    var  currentSubMenuArray: NSArray = []


    override func viewDidLoad() 
        super.viewDidLoad()

        // Do any additional setup after loading the view.

         subMenuTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "subCell")
    

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

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

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
        let  subMenuTableViewCell = tableView.dequeueReusableCellWithIdentifier("subCell", forIndexPath: indexPath)
        let  subMenuLabel: UILabel = UILabel.init(frame: CGRectMake(10, 10, 250, 25))
        subMenuLabel.text = currentSubMenuArray.objectAtIndex(indexPath.row) as? String
        subMenuTableViewCell.contentView.addSubview(subMenuLabel)
        return subMenuTableViewCell
    



故事板:

输出:

要测试示例项目,请使用我的 GitHub 帐户的以下链接:

https://github.com/k-sathireddy/MenuTableViewSample

【讨论】:

好的,请告诉我在哪里定义以及如何将所选数组传递给 subMenuViewController【参考方案2】:

声明一个用于显示的数组,并根据菜单、子菜单等的选择和屏幕状态更改数组的内容,并重新加载表格以显示主数组中的数据。如果你想为不同的选择显示不同类型的单元格,你可以通过枚举当前屏幕状态来实现它,就像我说的那样,并返回在 cellForRowAtIndexPath 中初始化的所需单元格。一切都与您可以思考和实现逻辑的程度有关。如果您需要使用已经使用过的代码的真正技术解决方案,请在下方评论。

【讨论】:

以上是关于如何更改 UItableview 的数据?的主要内容,如果未能解决你的问题,请参考以下文章

UITableView reloadData 在没有行的情况下无法工作

在两个 UITableView 之间转换时如何模仿 UINavigation 动画行为

FMDB 和 UITableView

UITableviewcell 是错误的数据

来自故事板的 UITableView - 使用 UITableViewStyleGrouped 初始化

如何更改 UItableview 的数据?