Swift - 从另一个 ViewController 在 TableView 中插入项目

Posted

技术标签:

【中文标题】Swift - 从另一个 ViewController 在 TableView 中插入项目【英文标题】:Swift - insert item in TableView from another ViewController 【发布时间】:2019-12-30 18:20:47 【问题描述】:

我遇到了一个问题,我似乎将项目添加到另一个 tableView 中的另一个 ViewController,但在展示 VC 时它们不会出现。

我也有不同的tableViews,这让它有点困难:

这是我的第一个ViewControllerA 里面,我可以从那里访问第二个ViewControllerB

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

    // if indexPath.item is less than data count, return a "Content" cell
    if indexPath.item < wishListTitlesArray.count 
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ContentCell", for: indexPath) as! ContentCell

        cell.cellLabel.text = wishListTitlesArray[indexPath.item]

        cell.buttonView.setImage(wishListImagesArray[indexPath.item], for: .normal)

        cell.customWishlistTapCallback = 

            // track selected index
            self.currentWishListIDX = indexPath.item

            let vc = self.storyboard?.instantiateViewController(withIdentifier: "WishlistVC") as! WishlistViewController
            // set image
            vc.wishlistImage.image = self.wishListImagesArray[indexPath.item]
            // set label
            vc.wishlistLabel.text = self.wishListTitlesArray[indexPath.item]
            // set wishlist
            vc.theTableView.wishList = self.userWishListData[indexPath.item]

            vc.currentWishListIDX = self.currentWishListIDX

            vc.userWishListData = self.userWishListData

            vc.theTableView.tableView.reloadData()
            self.present(vc, animated: true, completion: nil)

        

        return cell
    

func insertWish()

    insertWishDelegate?.insertWish(wishName: popUpView.whishName!, idx: selectedWishlistIDX!, currentWishlistIDX: currentWishListIDX,data: userWishListData)

    // save Wish to database -> DataHandler
    saveWish()


这是在我的第二个 ViewController 中:

func insertWish(wishName: String, idx: Int, currentWishlistIDX: Int, data: [[Wish]]) 
    // append the new wish to the user's currently selected wishlist
    var wishes: [Wish] = data[idx]
    wishes.append(Wish(withWishName: wishName, checked: false))
    userWishListData[currentWishlistIDX] = wishes
    // set the updated data as the data for the table view
    theTableView.wishList = userWishListData[currentWishlistIDX]
    theTableView.tableView.reloadData()

呈现第二个 ViewController 工作得很好。我传递的所有变量都是正确的。我唯一的问题是我无法插入“愿望”。没有错误什么的。用户可以从第一个 ViewController 添加愿望:

@objc func wishButtonTapped()
    dismissPopUpView()
    insertWish()

对于整个项目,您可以查看我的 git(虽然非常混乱):Git Project

我可能错过了一些非常基本的东西,但我无法理解它的本质,所以我非常感谢每一个帮助:)

【问题讨论】:

我快速浏览了您的项目。对于您的问题,我没有直接的答案,但我建议将您的数据模型移动到一个管理它的类中,以降低视图控制器的复杂性。这样做可能会使您当前的问题变得无关紧要。 @PhillipMills 听起来不错,但我不太清楚你的意思是什么,我还是个新手。你能详细说明一下吗?:) 我通常会创建一个对象,该对象负责在我的应用程序中的其他类之间共享的任何状态信息。视图控制器不存储该信息的副本,也不对其采取行动。相反,它们告诉数据模型对象执行插入、删除或其他操作。当他们需要显示数据时,他们会向模型对象索取数据。这样,数据只有一个真实来源,无需同步本地控制器更新。 @PhillipMills 我应该使用struct 还是class 来达到我的目的? 【参考方案1】:

您的代码无法工作,因为您正在访问 vc 中的 UI 元素,这些元素在实例化视图控制器后(尚未)连接。

其次,强烈建议您不要对数据源使用多个数组。永远不要那样做。创建一个自定义结构来保存一项的所有参数(在下面的代码中称为 Item)并使用 one 数据源数组(称为 datasourceArray)。

然后将项目分配给一个临时变量(vc 中的wishList)并将值分配给viewDidLoad 中的 UI 元素

此示例假定三个数组(imagetitledata)中的值位于自定义结构的一个实例中。您必须重新设计整个数据模型。在闭包中将Item 实例传递给vc

cell.customWishlistTapCallback = 

        // track selected index
        self.currentWishListIDX = indexPath.item

        let vc = self.storyboard?.instantiateViewController(withIdentifier: "WishlistVC") as! WishlistViewController
        vc.wishlist = datasourceArray[indexPath.item]
        vc.currentWishListIDX = self.currentWishListIDX
        vc.userWishListData = self.userWishListData
        self.present(vc, animated: true, completion: nil)
    

在 vc 中 viewDidLoad 填充 UI 元素并重新加载表格视图

var wishList : Item!

override func viewDidLoad()
    super.viewDidLoad()
    wishlistImage.image = wishList.image
            // set label
    wishlistLabel.text = wishList.title
            // set wishlist
    theTableView.wishList = wishList.data
    theTableView.tableView.reloadData()

【讨论】:

好的,这将是相当多的工作:D 但如果它不起作用,我会试一试并再次联系。谢谢!

以上是关于Swift - 从另一个 ViewController 在 TableView 中插入项目的主要内容,如果未能解决你的问题,请参考以下文章

swift Swift - 从另一个类调用一个方法

从另一个 .swift 文件调用 ViewController 函数

在 Swift 中从另一个 ViewController 访问变量

uipageviewcontroller 中的 Swift uipageviewcontroller

Swift:从另一个函数获取函数中的变量

Swift - 从另一个函数访问 UIView 的实例