Я успешно запретил пользователю вводить элемент панели вкладок, который позволяет добавлять слова в таблицу, если языки не введены или не выбраны в другом элементе панели вкладок, называемом языками.Моя проблема заключается в том, что он также блокирует пользователю доступ к элементу панели «Больше» при тех же условиях, тем больше контроллер представления должен быть всегда доступен.
Итак, я попробовал пару подходов, во-первых, случай переключенияоператор, а второй использует ключевое слово guard и shouldSelect параметр 'viewController'.Оба создают одинаковые результаты (больше вкладка недоступна, когда это должно быть).
Вот версия оператора регистра переключателя:
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
loadLanguages()
chosenLanguageRemovedLoad()
print("tabBarController shouldSelect languages \(languages) and chosenLanguageRemoved \(chosenLanguageRemoved)")
switch viewController {
case is LanguagesViewController:
return true
case is WordsViewController:
if languages.isEmpty == true || chosenLanguageRemoved == true {
shouldSelect = false
} else {
shouldSelect = true
}
if shouldSelect == false {
if languages.isEmpty == true && chosenLanguageRemoved == false {
let ac = UIAlertController(title: "Add Language(s)", message: nil, preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .default)
ac.addAction(okAction)
present(ac, animated: true)
} else if languages.isEmpty == false && chosenLanguageRemoved == true {
let ac = UIAlertController(title: "Choose a Language", message: nil, preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .default)
ac.addAction(okAction)
present(ac, animated: true)
} else if languages.isEmpty == true && chosenLanguageRemoved == true {
let ac = UIAlertController(title: "Add Language(s) and choose a language", message: nil, preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .default)
ac.addAction(okAction)
present(ac, animated: true)
}
}
break;
case is MoreViewController:
return true
default:
break;
}
myTabBarDelegate?.shouldPerformSegue()
return true
}
А вот версия слова защитного ключа:
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
loadLanguages()
chosenLanguageRemovedLoad()
print("tabBarController shouldSelect languages \(languages) and chosenLanguageRemoved \(chosenLanguageRemoved)")
guard viewController is MoreViewController else {
if languages.isEmpty == true && chosenLanguageRemoved == false {
let ac = UIAlertController(title: "Add Language(s)", message: nil, preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .default)
ac.addAction(okAction)
present(ac, animated: true)
return false
} else if languages.isEmpty == false && chosenLanguageRemoved == true {
let ac = UIAlertController(title: "Choose a Language", message: nil, preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .default)
ac.addAction(okAction)
present(ac, animated: true)
return false
} else if languages.isEmpty == true && chosenLanguageRemoved == true {
let ac = UIAlertController(title: "Add Language(s) and choose a language", message: nil, preferredStyle: .alert)
let okAction = UIAlertAction(title: "OK", style: .default)
ac.addAction(okAction)
present(ac, animated: true)
return false
} else {
return true
}
}
myTabBarDelegate?.shouldPerformSegue()
return true
}
Я правильно настроил делегат и протоколы (согласно учебному пособию).Я попытался поместить метод shouldPerformSegue в класс контроллера more view, но он снова дает те же результаты.