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 元素
此示例假定三个数组(image
、title
和 data
)中的值位于自定义结构的一个实例中。您必须重新设计整个数据模型。在闭包中将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 文件调用 ViewController 函数
在 Swift 中从另一个 ViewController 访问变量