按下按钮时,使用新部分填充UItableView

时间:2016-09-22 00:53:51

标签: ios swift uitableview

我在一个项目中工作,我在ViewController 1中创建了一个TableView。         在这个VC1中,我还创建了一个显示popupView的按钮(让它称之为popupButton)。        弹出视图包含一些数据,即按钮表示的饭菜。当点击按钮时,我收集从弹出视图中选择的膳食并通过委托将其发送回VC1。我设法完成了这项工作,我可以在UITableView上显示所选择的饭菜。问题是我想根据所选的客户端(在VC1中我有代表每个客户端的UI按钮)填充tableView,如下所示:

  • 客户1
    • 一餐A
    • 饭B
  • 客户2
    • 饭C
    • 餐X等

如果选择了按钮客户端1并且点击了膳食A,则创建部分C1作为标题和膳食A膳食B,依此类推。然后,当我点击客户端2并且我选择其他膳食时,将这些膳食添加到新的部分,其标题将是客户端2.目前,如果选择了客户端1作为标题。但是,如果我点击客户端2并选择新餐,它会将标题更改为客户端2,并且不会创建新的部分。另外我的代码可以工作,即使我没有选择任何客户,我也可以在我的餐桌上添加餐点(到目前为止它还不错,但我希望工作时客户是选择的)

在下面的代码中,我只展示了有助于理解我到目前为止所做的工作的部分。任何想法,因为我现在一直在寻找一段时间。我正在考虑使用struct,但我不知道如何将它与我的案例混合使用。我看到的所有例子似乎都是关于静态情况,而我正在寻找动态的东西。亲爱的读者,感谢您抽出宝贵时间阅读我的问题,并帮助一个绝望的灵魂'。

var meal: String?  // this var is used to collect the name of the meal

var mycustomer:String = "" // this var gets the name of the customer
    @IBAction func clientselected(sender: UIButton) {
    if sender.selected {
        sender.backgroundColor = UIColor.lightGrayColor()
        sender.selected = false

        print ("the button is unselected")
       }

    else {
        sender.backgroundColor = UIColor.redColor()
        sender.selected = true
        print ("the button is selected")
        let clientname = sender.titleLabel!.text
        mycustomer = clientname!

        }

var myarray = [String]() // Create an empty array of strings that we can fill later on with the meals selected


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

    return myarray.count  // Gets the number of strings in the array
}

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

    let cell = tableView.dequeueReusableCellWithIdentifier("Leschoix", forIndexPath:indexPath) as UITableViewCell!
    cell.textLabel?.text = myarray[indexPath.row]
    return cell

}

func tableView(tableView: UITableView, titleForHeaderInSection section: Int)-> String?
{
    return "\(mycustomer)"}

func foodselected(valuesent:String) { // this func gets the name of the meal tapped in the popUpView through delegation
    let meal = valuesent
        print("OrderViewcontroller\(meal)")
    myarray.append(meal) // each meal selected will be added up to the empty myarray
        print ("Here is the food array \(myarray)")
    self.TableView.reloadData()

}

2 个答案:

答案 0 :(得分:0)

就我理解你的需要而言,我会尽力回答你。

所以我们希望能够拥有多个部分。所以我们需要一个变量来改变tableView中的节数。

var numberOfSections: Int = 1

func numberOfSectionsInTableView(tableView: UITableView) -> Int {

     return numberOfSections
}

这样我们可以根据我们在TableView中有1或2个部分的需要来更改numberOfSections

然后我们需要有多个数组来定义numberOfRowsInSection。否则,我们将在每个部分具有完全相同的元素。如果我们使用您当前的版本。两个部分都具有完全相同的内容。

var sectionOneArray = [String]()
var sectionTwoArray = [String]()

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

if section == 0 {
     return sectionOneArray.count
}

if section == 1 {
     return sectionTwoArray.count
}

     return 0 
}

我们还需要两个客户字符串来填充titleForHeaderInSection

var myFirstCustomer = ""
var mySecondCustomer = ""

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

        if section == 0 {
            return myFirstCustomer
        }

        if section == 1 {
            return mySecondCustomer
        }
}

现在我们可以填充数组并告诉我们的应用程序是否需要一个或两个部分,具体取决于这样的客户数量。我们还需要有可能告诉我们是否在Popup for Customer 1或Customer 2中选择了Menus,但我目前不知道你的Popup是什么样的,但是代码会是这样的:

func foodselected(valuesent:String) { 

     if popUpChoseForCustomerOne {
          let meal = valuesent

          sectionOneArray.append(meal)
     } 

     if popUpChoseForCustomerTwo {
          let meal = valuesent

          sectionTwoArray.append(meal)
          numberOfSections = 2 
     }     

     self.TableView.reloadData()

}

我在没有IDE的情况下执行了此代码,因此可能并不完美。但它肯定会让你知道如何处理这个问题。

答案 1 :(得分:0)

关注@David寻求灵感,

我创建了一个获取客户端数量的变量,因为客户端数量将对应于表格视图的部分数量。此数字的变化取决于是否选择了客户端1(1个部分),客户端2,(2个部分)或客户端3 ......依此类推。由于我为每个按钮分配了一个标签,因此我得到了如下所示的标签:

var numberofclients:Int = 1
@IBAction func clientselected(sender: UIButton) {
    if sender.selected {
        sender.backgroundColor = UIColor.lightGrayColor()
        sender.selected = false

        print ("the button is unselected")
       }

    else {
        sender.backgroundColor = UIColor.redColor()
        sender.selected = true
        let clientname = sender.titleLabel!.text
        mycustomer = clientname!
        numberofclients = sender.tag
        print ("the button \(numberofclients) is selected")

        }

然后我创建了2个空字符串,我填写了每个客户选择的餐点:

var firstarray = [String]()
var secondarray = [String]()

在tableview中实现后,它看起来像这样:

func numberOfSectionsInTableView(tableView: UITableView) -> Int {


    return numberofclients

}

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

    if section == 0 {

    return firstarray.count  // Gets the number of strings in the array of C1
        }
    if section == 1 {

        return secondarray.count  // Gets the number of strings in the array of C2
    }


    return 0
}

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

    let cell = tableView.dequeueReusableCellWithIdentifier("Leschoix", forIndexPath:indexPath) as UITableViewCell!
    if indexPath.section == 0 { // If you are in section 1, i.e, if client 1 is selected fill the first array with the meal selected
    cell.textLabel?.text = firstarray[indexPath.row]
        }
    if indexPath.section == 1 // If you are in section 2, i.e. if client 2 is selected, fill the second array with the meal selected by the client
    {
        cell.textLabel?.text = secondarray[indexPath.row]
    }


    return cell

}

为了填充细胞,我在开关中使用了David的想法

func poutinechoisie(valuesent:String) {
    let meal = valuesent
        print("OrderViewcontroller\(mealselected)")

    switch numberofclients {
    case 1:
    firstarray.append(meal)
        print ("here is the first array \(firstarray)")

    case 2:
        secondarray.append(meal)
        print ("here is the second \(c2array)")
       } 

我还没有为标题部分创建单元格。我先运行程序,看看我得到了什么,并且它有效!:

当我选择客户端1时,这意味着我有1个部分,所以我点击popupButton,我可以添加我想要的食物。然后,当我选择客户端2(标签现在为2)时,我有2个部分,所以我也可以添加我想要的食物,我得到了这个:

  • 客户1
  • 一餐A
  • 饭B

  • 客户2

  • 饭C
  • 饭D

但是,当我决定向客户1添加一顿新餐时(假设是一顿饭E),它会删除我为客户2添加的所有内容,并显示:

  • 客户1
  • 一餐A
  • 饭B
  • 饭E

我认为这与以下事实有关:当我重新选择客户端1时,客户端数量从2变为1,并删除之前添加的所有内容。所以我现在想一些方法来解决这个新的有趣问题。

我还注意到,如果我决定先点击按钮2,这意味着在客户1之前接受客户2订单(餐点C),它会创建2个部分,第1个部分为空白(见下文)。

  • 客户1
  • 空白
  • 客户2
  • 饭C

到目前为止,它并没有打扰我,但我想有一种方法只有一个部分,并显示如下:

  • 客户2
  • 饭C