2016-07-15 44 views
-1

好吧,基本上我正在关注udemy的一个教程,关于如何创建与Backendless和Firebase的聊天。不过,我不想使用Backendless,因为我不想依赖2个提供商 - 所以我只想坚持使用Firebase。因此,我目前正在将我的代码转换为Firebase。Swift中奇怪的可选错误

我有一个视图控制器,显示每个UID独特的页面 - 从我有一个数据库。 UID存储为String,并在另一个表视图控制器的segue上分配(此工作正常)。之后,我使用UID从用户那里获取我想要的数据。我有一个“开始聊天”按钮,应该创建一个新的聊天。

在本教程中,教师设置了一个从另一个视图控制器触发另一个函数的协议(委托)。这是什么样子:

protocol ChooseUserDelegate { 
    func createChatroom(withUser: String) 
} 

var delegate: ChooseUserDelegate! 

和我聊天@IBAction,我有这样的代码:(上面的代码都是在同一个VC)

@IBAction func StartChat(sender: AnyObject) { 

    let userID = uid 
    if let theId = userID as? String { 
     delegate.createChat(String(theId)) 
    } 

} 

在另一个视图控制器,其中,所述createChat()函数存储,是以下代码:

class AnotherVC UIViewController, UITableViewDelegate, UITableViewDataSource, ChooseUserDelegate{ 

    func createChat(withUser: String) { 

     print(withUser) 

    } 

} 

的问题是,我不能得到调用createChat(),因为一个可选的错误(展开)上的delegate.createChat(String(theId))

编辑:即使有一个“”输入,我得到一个错误。我现在很困惑。我的代表有问题吗?

+0

检查你的委托变量声明。 –

+0

@RohitKP就我而言,这是正确的。我可以用更多的代码更新我的文章。 – askaale

+2

你能格式化你的问题,使其清晰可辨吗? – matt

回答

0
if let theId = userID { 
    delegate.createChat(String(theId)) 
} 
+0

有条件的绑定必须具有可选的类型(?),这就是为什么这不起作用:/ – askaale

+0

但感谢您的帮助。真的很感激它!我似乎也无法自己弄清楚。 – askaale

+0

查看我的更新回答 – chengsam

2

代码的唯一部分是可选的是delegate(因为你正确解开userID)。因此,该错误必须是由于delegatenil。确保您在致电StartChat()之前设置了delegate

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) 
    } 
} 
+0

只需再提一点,协议中的方法应该是: 'func createChat(withUser:String)' – chengsam

+0

I已经初始化我的主类下的代表(顶部)。 – askaale

+0

@askaale你可以打印委托出来看看它是否为 – chengsam