Как получить данные для сохранения в определенной категории в виде таблицы вместо всех категорий?

У меня есть приложение groceryList, когда вы добавляете элемент в список категорий, оно добавляется ко всему списку категорий, когда этого не следует!

https://github.com/mrbryankmiller/Grocery-TableView-.git

class GroceryItemsTableViewController: UITableViewController {

    //var groceryItem = ["Item1", "Item2", "Item3"]

    //var groceryList  = ["Breakfast","Lunch", "Dinner"]


    @IBOutlet var groceryItemTableView: UITableView!


    @IBAction func addGroceryItemButtonPressed(sender: UIBarButtonItem) {

        ///new way///

        let alertController: UIAlertController = UIAlertController(title: "Add Grocery Item", message: "", preferredStyle: .Alert)

        //Cancel Button

        let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
            //cancel code
        }
        alertController.addAction(cancelAction)
        let saveAction: UIAlertAction = UIAlertAction(title: "Save", style: .Default) { action -> Void in

            let textField = alertController.textFields![0]
            groceryItem.items.append(textField.text!)
            self.tableView.reloadData()

        }

        alertController.addAction(saveAction)


        //Add text field

        //        alertController.addTextFieldWithConfigurationHandler { (textField) -> Void in
        //        textField.textColor = UIColor.blackColor()

        alertController.addTextFieldWithConfigurationHandler { (textField : UITextField!) -> Void in
            textField.placeholder = "Enter an Item"
            //alertController.textFields
        }

        //Present the AlertController
        self.presentViewController(alertController, animated: true, completion: nil)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        //self.navigationItem.leftBarButtonItem = self.editButtonItem()

    }

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


    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows

        return groceryItem.items.count

    }


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCellWithIdentifier("groceryItem1", forIndexPath: indexPath)
        cell.textLabel!.text = groceryItem.items [indexPath.row]
        return cell

    }
}

1 ответ

Решение

Если вы внимательно посмотрите объявление вашего класса groceryItem у тебя есть static массив элементов для каждого элемента в списке покупок, поэтому каждый раз, когда вы добавляете новый элемент, он распределяется между всеми элементами бакалеи.

Вместо этого у вас должен быть список продуктов, связанный с каждым из них.

Вы можете определить новый struct сохранить для каждого продуктового элемента свой список связанных элементов следующим образом:

struct GroceryItem {
   var name: String
   var items: [String]
}

Мы собираемся немного изменить код в вашем GroceryListTableViewController провести рефакторинг кода в соответствии с вашей новой моделью, поэтому он должен выглядеть следующим образом:

GroceryListTableViewController:

class GroceryListTableViewController: UITableViewController, GroceryItemsTableViewControllerProtocol {


    var groceryList = [GroceryItem]()

    @IBAction func addButton(sender: UIBarButtonItem) {

       let alertController: UIAlertController = UIAlertController(title: "Add Grocery Category", message: "", preferredStyle: .Alert)

       //Cancel Button

       let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
        //cancel code
       }
       alertController.addAction(cancelAction)

       let saveAction: UIAlertAction = UIAlertAction(title: "Save", style: .Default) { action -> Void in

          let textField = alertController.textFields![0]
          self.groceryList.append(GroceryItem(name: textField.text!, items: [String]()))
          self.tableView.reloadData()
       }
       alertController.addAction(saveAction)

       alertController.addTextFieldWithConfigurationHandler { (textField : UITextField!) -> Void in
          textField.placeholder = "Enter an Item"
          //alertController.textFields
        }

       //Present the AlertController
       self.presentViewController(alertController, animated: true, completion: nil)
    }

    override func viewDidLoad() {

       super.viewDidLoad()

       //edit button
       self.navigationItem.leftBarButtonItem = self.editButtonItem()

       groceryList.append(GroceryItem(name: "Breakfast", items: ["Item1", "Item2",  "Item3"]))
       groceryList.append(GroceryItem(name: "Lunch", items: ["Item1", "Item2",  "Item3"]))
       groceryList.append(GroceryItem(name: "Dinner", items: ["Item1", "Item2",  "Item3"]))

    }

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

       return groceryList.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
       let cell = tableView.dequeueReusableCellWithIdentifier("prototype1", forIndexPath: indexPath) as UITableViewCell

       cell.textLabel!.text = groceryList [indexPath.row].name

       return cell
    }

   // pass a tableview cell value to navigationBar title in swift//

   override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
      let destinationVC = segue.destinationViewController as! GroceryItemsTableViewController
      let cell = sender as! UITableViewCell

      let idx = self.tableView.indexPathForSelectedRow?.row

      destinationVC.delegate = self
      destinationVC.itemList = groceryList[idx!].items
      destinationVC.navigationItem.title = cell.textLabel?.text
   }

   func didAddGroceryItem(itemName: String) {
      let idx = self.tableView.indexPathForSelectedRow?.row
      groceryList[idx!].items.append(itemName)
   }

   func didRemoveGroceryItem(index: Int) {
    let idx = self.tableView.indexPathForSelectedRow?.row
    groceryList[idx!].items.removeAtIndex(index)
   }  
}

Выше я рефакторил весь код, касающийся новой модели, я поместил только те места, где код изменился, остальное осталось прежним.

То, что вам нужно, чтобы передать элемент, связанный с выбранной ячейкой, другому UIViewController и вы можете сделать это очень легко в вашем prepareForSegue, Для этого нам нужно получить индекс для выбранной ячейки и передать элементы другой UIViewController где у нас есть новый массив [String] создан как источник данных для отображения элементов.

Другим важным моментом в коде является то, что GroceryListTableViewController теперь реализует новый протокол под названием GroceryItemsTableViewControllerProtocol, Этот протокол это способ уведомить GroceryListTableViewController от GroceryItemsTableViewController каждый раз, когда новый элемент добавляется в список, он называется шаблоном делегата.

GroceryItemsTableViewController:

protocol GroceryItemsTableViewControllerProtocol: class {

   func didAddGroceryItem(itemName: String)

   func didRemoveGroceryItem(index: Int)
}

class GroceryItemsTableViewController: UITableViewController {

     weak var delegate: GroceryItemsTableViewControllerProtocol?

     var itemList: [String]!

     @IBAction func addGroceryItemButtonPressed(sender: UIBarButtonItem) {

        ///new way///

       let alertController: UIAlertController = UIAlertController(title: "Add Grocery Item", message: "", preferredStyle: .Alert)

       //Cancel Button

       let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel) { action -> Void in
          //cancel code
       }
       alertController.addAction(cancelAction)


       let saveAction: UIAlertAction = UIAlertAction(title: "Save", style: .Default) { [weak self] action -> Void in

          guard let s = self else { return }

          let textField = alertController.textFields![0]

          s.itemList.append(textField.text!)
          s.delegate?.didAddGroceryItem(textField.text!)
          s.tableView.reloadData()

       }

      alertController.addAction(saveAction)

      alertController.addTextFieldWithConfigurationHandler { (textField : UITextField!) -> Void in
         textField.placeholder = "Enter an Item"
        //alertController.textFields
      }

      //Present the AlertController
      self.presentViewController(alertController, animated: true, completion: nil)
  }

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


  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
      let cell = tableView.dequeueReusableCellWithIdentifier("groceryItem1", forIndexPath: indexPath)


      cell.textLabel!.text = itemList[indexPath.row]
      return cell

  }

  override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        // Delete the row from the data source
        itemList.removeAtIndex(indexPath.row)
        delegate?.didRemoveGroceryItem(indexPath.row)
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    } else if editingStyle == .Insert {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }
  }
}

РЕДАКТИРОВАТЬ: Для правильной обработки удаления вы должны создать новый метод делегата, не уведомлять GroceryListTableViewController что элемент был удален, а затем удалите его правильно, и вы можете увидеть в обновленном коде выше.

Я надеюсь, что это поможет вам.

Другие вопросы по тегам