好的,基本上我正在关注如何使用Backendless和Firebase创建聊天的udemy教程。但是,我不想使用Backendless,因为我不想依赖2个提供商 - 所以我只想坚持使用Firebase。因此,我目前正在将代码转换为Firebase。
我有一个视图控制器,它为每个UID显示一个唯一的页面 - 来自我拥有的数据库。 UID存储为String
,并在另一个表视图控制器的segue上分配(这很好)。之后,我使用UID从用户那里获取我想要的数据。我有一个"开始聊天"应该创建新聊天的按钮。
在本教程中,教师设置了一个协议(委托),它从另一个视图控制器触发另一个函数。这就是它的样子:
protocol ChooseUserDelegate {
func createChatroom(withUser: String)
}
var delegate: ChooseUserDelegate!
在聊天@IBAction
中,我有以下代码:
@IBAction func StartChat(sender: AnyObject) {
let userID = uid
if let theId = userID as? String {
delegate.createChat(String(theId))
}
}
(上面的代码都在同一个VC中。)。
在另一个视图控制器中,存储createChat()
函数的是以下代码:
class AnotherVC UIViewController, UITableViewDelegate, UITableViewDataSource, ChooseUserDelegate{
func createChat(withUser: String) {
print(withUser)
}
}
由于createChat()
上的可选错误(展开),问题是我无法拨打delegate.createChat(String(theId))
。
编辑:即使使用""输入,我收到一个错误。我现在真的很困惑。我的代表有问题吗?
答案 0 :(得分:2)
代码中唯一可选的部分是delegate
(因为您正确解开了userID
)。因此,错误必须归因于delegate
为nil
。确保在致电delegate
之前设置StartChat()
。
第var delegate: ChooseUserDelegate!
行未初始化委托。当您编写ChooseUserDelegate!
时,您只是定义delegate
变量的类型。它会自动设置为nil
。要初始化ChooseUserDelegate
的新实例,您需要编写如下内容:
var delegate: ChooseUserDelegate! = ChooseUserDelegate()
还有一些其他方法可以清理代码。方法名称应该是llamaCase,而不是CamelCase,因此您应该将StartChat()
重命名为startChat()
(确保在界面构建器中重新连接)。该方法的主体对同一个变量uid
有三个不同的名称。看看它有多简单:
@IBAction func startChat(sender: AnyObject) {
if let uid = uid as? String {
delegate.createChat(uid)
}
}
答案 1 :(得分:0)
if let theId = userID {
delegate.createChat(String(theId))
}