2016-07-15 2 views
-1

Хорошо, так что в основном я следую учебнику по udemy о том, как создать чат с Backendless и Firebase. Тем не менее, я предпочитаю не использовать Backendless, потому что я не хочу полагаться на 2 провайдера - поэтому я хочу придерживаться только Firebase. Поэтому в настоящее время я конвертирую свой код в Firebase.странная дополнительная ошибка в Swift

У меня есть контроллер вида, который отображает уникальную страницу для каждого UID - из базы данных, которая у меня есть. UID хранится как String и назначается по отдельности из другого контроллера табличного представления (это отлично работает). После этого я получаю данные, которые я хочу от пользователя, с 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)) 
    } 

} 

.

В другом контроллере представления, где функция 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). Поэтому ошибка должна быть вызвана delegate, являющейся nil. Перед тем, как позвонить 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 вы можете распечатать делегата, чтобы узнать, не является ли оно nil – chengsam

Смежные вопросы