我在使用集合视图中的代码添加新餐时遇到问题。 当我添加一个新的单元格并展开时,它只会替换另一个单元格,而不会在集合视图中创建一个新的单元格

当我在表格视图中使用此代码时,它可以正常运行,但是我已转移到集合中,无法正常工作。

    @IBAction func unwindToMealList(sender: UIStoryboardSegue) {
    if let sourceViewController = sender.source as? MealViewController, let meal = sourceViewController.meal {

        if let selectedIndexPath = collectionView?.indexPathsForSelectedItems {
            // Update an existing meal.
            meals[selectedIndexPath.count] = meal
            collectionView!.reloadData()
        }
        else {

            // Add a new meal.

            let newIndexPath = IndexPath(item: meals.count, section: 0)
            print(newIndexPath)
            print(meals.count)
            meals.append(meal)
            collectionView!.insertItems(at: [newIndexPath])

             }
        saveMeals()


        }
    }
}

膳食集合视图控制器

import UIKit
import os.log

private let reuseIdentifier = "Cell"

class MealCollectionViewController: UICollectionViewController {

//MARK: Properties

var meals = [Meal]()

override func viewDidLoad() {
    super.viewDidLoad()

    // Use the edit button item provided by the table view controller.
    navigationItem.leftBarButtonItem = editButtonItem

    // Load any saved meals, otherwise load sample data.
    if let savedMeals = loadMeals() {
        meals += savedMeals

    }
    else {
        // Load the sample data.
        loadSampleMeals()
    }
}

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

//MARK: - Table view data source

override func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return meals.count
}


override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    // Table view cells are reused and should be dequeued using a cell identifier.
    let cellIdentifier = "MealCollectionViewCell"

    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as? MealCollectionViewCell  else {
        fatalError("The dequeued cell is not an instance of MealCollectionViewCell.")
    }

    // Fetches the appropriate meal for the data source layout.
    let meal = meals[indexPath.item]

    cell.photoImageView.image = meal.photo


    return cell
}





/*
 // Override to support rearranging the table view.
 override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) {

 }
 */

/*
 // Override to support conditional rearranging of the table view.
 override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
 // Return false if you do not want the item to be re-orderable.
 return true
 }
 */

//MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
    switch(segue.identifier ?? "") {
    case "AddItem":
        os_log("Adding a new meal.", log: OSLog.default, type: .debug)
    case "ShowDetail":
        guard let mealDetailViewController = segue.destination as? MealViewController else {
            fatalError("Unexpected destination: \(segue.destination)")
        }

        guard let selectedMealCell = sender as? MealCollectionViewCell else {
            fatalError("Unexpected sender: \(String(describing: sender))")
        }

        guard let indexPath = collectionView?.indexPath(for: selectedMealCell) else {
            fatalError("The selected cell is not being displayed by the table")
        }

        let selectedMeal = meals[indexPath.row]
        mealDetailViewController.meal = selectedMeal


    default:
        fatalError("Unexpected Segue Identifier; \(segue.identifier)")

    }




}

//MARK: Private Methods

private func loadSampleMeals() {

    let photo1 = UIImage(named: "meal1")
    let photo2 = UIImage(named: "meal2")
    let photo3 = UIImage(named: "meal3")

    guard let meal1 = Meal(name: "Caprese Salad", photo: photo1, method: "", ingredients: "") else {
        fatalError("Unable to instantiate meal1")
    }

    guard let meal2 = Meal(name: "Chicken and Potatoes", photo: photo2, method: "", ingredients: "") else {
        fatalError("Unable to instantiate meal2")
    }

    guard let meal3 = Meal(name: "Pasta with Meatballs", photo: photo3, method: "", ingredients: "") else {
        fatalError("Unable to instantiate meal2")
    }

    guard let meal4 = Meal(name: "Hello", photo: photo3, method: "", ingredients: "") else {
        fatalError("Unable to instantiate meal2")
    }


    meals += [meal1, meal2, meal3, meal4]
}

private func saveMeals() {
    let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(meals, toFile: Meal.ArchiveURL.path)
    if isSuccessfulSave {
        os_log("Meals successfully saved.", log: OSLog.default, type: .debug)
    } else {
        os_log("Failed to save meals...", log: OSLog.default, type: .error)
    }
}

private func loadMeals() -> [Meal]? {
    return NSKeyedUnarchiver.unarchiveObject(withFile: Meal.ArchiveURL.path) as? [Meal]
}


//MARK: Actions
@IBAction func unwindToMealList(sender: UIStoryboardSegue) {
    if let sourceViewController = sender.source as? MealViewController, let meal = sourceViewController.meal {

        if let selectedIndexPath = collectionView?.indexPathsForSelectedItems {
            // Update an existing meal.
            meals[selectedIndexPath.count] = meal
            collectionView!.reloadData()
        }
        else {

            // Add a new meal.

            let newIndexPath = IndexPath(item: meals.count, section: 0)
            meals.append(meal)
            collectionView!.insertItems(at: [newIndexPath])

             }
        saveMeals()


        }
    }
}

  ask by Harri translate from so

本文未有回复,本站智能推荐:

2回复

我只能通过prepareforSegue将新单元格添加到集合视图控制器中

我试图在另一个控制器向数组中添加一个额外的元素(用作视图控制器的数据源)之后,将新的单元格添加到我的collectionViewController 。 有人告诉我这样做是错误的,但是唯一可以让collectionViewController添加新单元格的方法是,如果我在prepareForS
1回复

将新单元格添加到集合视图时,我不断收到布局错误

我试图将数据从一个视图控制器添加到集合视图控制器,该集合控制器将一个元素添加到数据源数组,然后将一个单元格添加到集合视图。 在以前的ViewController prepareforsegue collectionViewController cellForItemAt 收到错误:
3回复

将单元格添加到集合视图。迅速

我通过xib创建了一个视图集合和一个自定义单元格。 单元格上只有一个Label 。 我必须通过TextField输入文本,用此文本填充数组,然后将其放入单元格中。 我需要在TextField中的每个文本条目之后创建一个单元格。 我还没有使用过集合,也不太了解它是如何工作的。 这就是我现在所拥有的 C
2回复

将单元格添加到UI集合视图的底部

我有一个CollectionView来显示消息array ,但是我希望单元格从底部开始显示。 示例为iOS的WhatsApp或Telegram App(新消息从底部开始并向上填充)。 我正在尝试转换我的收藏夹视图: 然后在cellForItemAt处转换收集单元格: 但是,当我插入
1回复

作为子视图添加到集合视图单元格时,滚动视图中的内容不可见

我有一个集合视图,其中包含一个滚动视图作为子视图,并且已经向滚动视图添加了一个文本视图,但是看不到该文本视图。 我为集合视图单元格使用了自定义类。 这是代码: 我是Swift的初学者。
2回复

无法将Lottie动画视图添加到集合视图单元格

我试图LOTAnimationView添加到我的收藏观察室,但是当我运行program.Here是在屏幕上也没有出现链接到洛蒂。 这是代码:
2回复

以编程方式将UIImage添加到集合视图单元格中

这是我的集合视图单元格的自定义类: 然后在我的控制器的viewDidLoad中 在cellForItem我有: 但是没有显示图像视图。 如果添加navBarCell.backgroundColor = UIColor.red则显示单元格,但不显示图像。 我缺少什么,还是执行不正
1回复

如何将现有的集合视图添加到表视图而不会在swift中丢失表视图单元格

我正在尝试将两个具有自己偏好的现有集合视图单元格添加到我已经存在的表视图的前两个单元格中,而不会丢失其他表视图单元格。 现在每个视图都手动运行良好。 这是我的用户界面收藏 V1: 收藏 V2: 表格视图 查看所有内容所在的控制器: