Изменить: Не уверен, что могу отметить вопрос как решенный, но это было благодаря Алексу. Это была проблема с последней версией Xcode, но инструкции предназначались для более старой. Перенос фрагментов кода из AppDelegate в SceneDelegate исправил это.
Я новичок в разработке приложений Xcode и IOS. Я прохожу свой первый курс, и мы получаем «практические занятия», в которых мы следуем пошаговым инструкциям и копируем и вставляем фрагменты кода для создания приложения. Следуя инструкциям, я застрял в определенном месте и безуспешно пытался поискать в Google / поискать информацию.
Приложение называется Ресторан и по сути позволяет пользователю просматривать меню (см. Элементы / цены / подробности) и добавлять определенные элементы в заказ, который затем отображается на другой вкладке под названием «Ваш заказ». Эти части были выполнены, но мой шаг - «обновить значение значка на вкладке« Заказ », чтобы оно соответствовало количеству элементов в заказе. Затем пользователь может увидеть, что они успешно добавили элемент без необходимости переключения вкладки ". UITabBarItem является необязательным, как указано в инструкциях внутри AppDelegate, но равен нулю.
Эта строка вызывает ошибку: Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
Похоже, что след ошибки происходит из updateOrderBadge()
, в частности, из-за корректировки orderTabBarItem
, являющейся основной проблемой. Комментируя эту единственную строку, все работает, хотя, конечно, я не получаю желаемого уведомления о значке. Не уверен, почему в той строке, которая идет непосредственно из руководства, возникают проблемы:
@objc func updateOrderBadge() {
orderTabBarItem.badgeValue = String(MenuController.shared.order.menuItems.count)
}
Я видел эту или аналогичную ошибку раньше, когда забыл подключить IBOutlets / Actions от кнопки к коду, предполагается ли быть чем-то вроде этого для UITabBarItem?
Для некоторого общего контекста вот инструкции и код на снимках экрана:
Снимок экрана с конкретными c лабораторными инструкциями, которые, как я думал, я выполнил шаг за шагом шаг / копирование и вставка напрямую
Снимок экрана раскадровки для контекста
Код внутри AppDelegate, что я изменение
В противном случае вот код в делегате приложения в тексте:
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var orderTabBarItem: UITabBarItem!
@objc func updateOrderBadge() {
orderTabBarItem.badgeValue = String(MenuController.shared.order.menuItems.count)
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
window = UIWindow()
orderTabBarItem = (self.window?.rootViewController as? UITabBarController)?.viewControllers?[1].tabBarItem
NotificationCenter.default.addObserver(self, selector: #selector(updateOrderBadge), name: MenuController.orderUpdatedNotification, object: nil)
return true
}
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
}
}