#ios #swift
#iOS #swift
Вопрос:
Я следовал этому руководству о том, как настроить a SLComposeViewController
, и оно включает в себя информацию о том, как настроить элементы конфигурации.
Я извлекаю данные из базы данных MongoDB, чтобы получить самый последний измененный элемент. Вот мой configurationItems()
:
override func configurationItems() -> [Any]! {
let configurationItems = [editConfigurationItem]
return configurationItems
}
и вот моя editConfigurationItem
переменная:
lazy var editConfigurationItem: SLComposeSheetConfigurationItem = {
func getFirstCategory(completion: @escaping(String) -> ()) {
DispatchQueue.main.async {
let email: String = customKeychainWrapperInstance.string(forKey: "email") ?? ""
let password: String = customKeychainWrapperInstance.string(forKey: "password") ?? ""
app.login(credentials: Credentials.emailPassword(email: email, password: password)) { (maybeUser, error) in
DispatchQueue.main.sync {
guard error == nil else {
print("Login failed: (error!)");
return
}
guard let _ = maybeUser else {
fatalError("Invalid user object?")
}
print("Login succeeded!");
}
let user = app.currentUser!
let configuration = user.configuration(partitionValue: user.id)
let predata = try! Realm(configuration: configuration)
let unsortedData = predata.objects(Tiktoks.self)
let data = unsortedData.sorted(byKeyPath: "date", ascending: false)
let firstCategory = data[0].category
let firstCategoryId = data[0]._id
print(firstCategory)
print(firstCategoryId)
self.selectedId = firstCategoryId
completion(firstCategory)
}
}
print("done")
}
let item = SLComposeSheetConfigurationItem()!
item.title = "collection"
item.valuePending = true
getFirstCategory() { (firstCategory) in
item.valuePending = false
print("completed")
item.value = firstCategory // Using self as the closure is running in background
}
item.tapHandler = self.editConfigurationItemTapped
return item
}()
(Извините за беспорядок кода, я новичок в Swift)
Пока это работает, но item.value
переменная не обновляется в пользовательском интерфейсе. Он «бесконечно загружается», пока вы не нажмете на элемент конфигурации. Однако, когда элемент конфигурации используется для перехода к другому представлению, фактическая переменная из базы данных отображается на долю секунды, прежде чем показывать следующее представление. Когда вы возвращаетесь из этого другого представления, фактическая переменная есть.
Мне кажется, что элемент конфигурации не обновляется. Я вижу, что есть reloadConfigurationItems()
, но, поместив это в my editConfigurationItem
, я бы подумал, что цикл вызовет цикл (и он также выдает ошибки). В документации даже говорится:
В частности, вам не нужно вызывать этот метод после изменения свойства элемента конфигурации, поскольку базовый класс SLComposeServiceViewController автоматически обнаруживает такие изменения и реагирует на них.
но похоже, что он не обнаруживает изменений.
Есть ли способ обновить item.value
и item.valuePending
?