У меня есть контроллер вкладки клиента, который имеет собственный значок, который, когда пользователь нажимает всплывающее меню, предлагает 3 варианта. Когда я выбираю первый вариант, он должен перейти к новому контроллеру представления, однако, когда я щелкаю по нему, контроллер представления появляется только на секунду, прежде чем снова исчезнуть. Я не уверен, почему, но вот мой код для панели вкладок клиента:
import UIKit
import PopMenu
class TabBarController: UITabBarController, UITabBarControllerDelegate {
override func viewDidLoad() {
delegate = self
}
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
if viewController.title == "for custom action" {
let manager = PopMenuManager.default
let action1 = PopMenuDefaultAction(title: "Scan Barcode", didSelect: { action in
self.performSegue(withIdentifier: "showScanBarcode", sender: nil)
print("\(String(describing: action.title)) is tapped")
})
let action2 = PopMenuDefaultAction(title: "Action 2", didSelect: { action in
print("\(String(describing: action.title)) is tapped")
})
let action3 = PopMenuDefaultAction(title: "Action 3", image: UIImage(named: "wine"), didSelect: { action in
print("\(String(describing: action.title)) is tapped")
})
manager.addAction(action1)
manager.addAction(action2)
manager.addAction(action3)
manager.present()
return false
}
return true
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "mySegue" {
let controller = segue.destination as! myViewController
controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
controller.navigationItem.leftItemsSupplementBackButton = true
}
}
}
Вот изображение, показывающее поток. Пользователь нажимает кнопку камеры, затем появляется всплывающее меню, и когда пользователь нажимает на опцию, я хочу перенести их на новый контроллер представления (не подключенный к контроллеру панели вкладок). Я установил первую ссылку, чтобы перейти к новому контроллеру представления, и она показывается в течение нескольких секунд, а затем исчезает.
3 ответа
Это проблема с PopMenue.
PopMenuManager отображает UIViewController на самом верхнем контроллере представления и вызывает dismiss () после выбора. Увольнение проходит через все контроллеры. К тому времени, когда он это сделает, ваш новый контроллер представления будет самым верхним и получит увольнение. Это может помочь сделать переход в отдельном потоке. (Возможно, с небольшой задержкой для тестирования)
let action1 = PopMenuDefaultAction(title: "Scan Barcode", didSelect: { action in
DispatchQueue.main.async {
self.performSegue(withIdentifier: "showScanBarcode", sender: nil)
}
print("\(String(describing: action.title)) is tapped")
})
Вы используете другой идентификатор для метода segue,
performSegue(withIdentifier: "showScanBarcode", sender: nil)
А ТАКЖЕ
prepare(for segue: UIStoryboardSegue, sender: Any?)
.
Поэтому, пожалуйста, используйте тот же идентификатор. Надеюсь, что это поможет вам.
Похоже, вы храните action1
в manager
, и это локально для этой функции. Итак, после того как функция завершит выполнение, manager
и ее содержимое выйдут из области видимости и получат сборщик мусора.
Чтобы обойти это, объявите manager
как переменную экземпляра в классе (вне функции). Например:
class TabBarController: UITabBarController, UITabBarControllerDelegate {
let manager = PopMenuManager.default
...
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
...
manager.addAction(action1)
}
}
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.