我有一个名为CloseFriendsController
的模式视图(在情节提要中制作),带有一个按钮,该按钮应将当前用户添加到Firebase中名为closeFriends
的列表中,然后关闭该模式视图。我在CloseFriendsController
中创建了该函数,并在点击按钮时调用了该函数:
var buttonFunc: (() -> (Void))!
@IBAction func addToCloseFriends(_ sender: UIButton) {
buttonFunc()
self.presentingViewController?.dismiss(animated: true, completion: nil)
print("Added to Close Friends!")
}
func setFunction(_ function: @escaping () -> Void) {
self.buttonFunc = function
}
这是CloseFriendsController(“是的,我很沮丧!”按钮链接到addToCloseFriends
函数):
该功能已设置在要显示当前用户的单元格的cellForItemAt indexPath
中:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let closeFriends = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath)
let closeFriendsController = CloseFriendsController()
closeFriendsController.setFunction {
let id = CloseFriendsSystem.system.friendList[indexPath.row].uid
CloseFriendsSystem.system.addCurrentUserToFriendsCloseFriendsLists(id)
print("currentUser added to Friends' Close Friends list!!")
}
return closeFriends
}
注释为print("Added to Close Friends!")
时,将打印buttonFunc()
语句,但是buttonFunc()
行导致应用程序崩溃并显示警告:
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
我已经创建了一个函数,调用了该函数,并以相同的方式对其进行了多次设置。但是,在这些情况下,调用该函数的按钮在cellForItemAt indexPath
所引用的单元格内。因此,我想我需要找到一种不同的方式来调用indexPath?但是我不知道该怎么办。
我尝试使用一个函数创建委托,该委托将导致在设置该函数的同一控制器中创建buttonFunc
函数。但是,从未调用其他控制器中的函数。
我真的被困在这里,所以任何帮助都会很棒!
答案 0 :(得分:0)
解决方案:
您需要如下更改CollectionView委托和数据源代码:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let closeFriends = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath)
return closeFriends
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// initialize closeFriendsController
let closeFriendsController = CloseFriendsController() // change this line as you need
closeFriendsController.id = CloseFriendsSystem.system.friendList[indexPath.row].uid
// present closeFriendsController
self.present(closeFriendsController, animated: true, completion: nil) // change this line if you are presenting differently
}
在您的CloseFriendsController中:
删除 var buttonFunc:(()->(Void))!
var id: String!
@IBAction func addToCloseFriends(_ sender: UIButton) {
guard let id = self.id else { return }
CloseFriendsSystem.system.addCurrentUserToFriendsCloseFriendsLists(id)
self.presentingViewController?.dismiss(animated: true, completion: nil)
print("Added to Close Friends!")
}
也删除
func setFunction(_函数:@escaping()-> Void){
self.buttonFunc =函数
}