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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift-从另一个ViewController插入TableView中的项目相关的知识,希望对你有一定的参考价值。

我似乎在将项目添加到另一个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

我可能会错过一些非常基本的东西,但我无法落后于它,所以我非常感谢每一个帮助:)

答案

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

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

然后将项目分配给临时变量(wishList中的vc,并将值分配给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)
    }

并且在viewDidLoad中的vc中填充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()
}

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

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

Swift:使用完成处理程序从另一个通知 ViewController

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

从另一个类 Swift 更新视图控制器的 UI [关闭]

Swift:从另一个类调用 UIButton press

从另一个视图控制器单击 uitableviewcell 后,swift 3 更改 uitableviewcell?