Контроллер исчезает после Segue - PullRequest
5 голосов
/ 02 мая 2019

У меня есть контроллер вкладок клиента, у которого есть пользовательский значок, который, когда пользователь нажимает, во всплывающем меню появляется 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

        }
    }

}

Вот изображение, показывающее поток. Пользователь нажимает кнопку камеры, затем появляется всплывающее меню, и когда пользователь нажимает на опцию, я хочу перенести их на новый контроллер представления (не подключенный к контроллеру панели вкладок). Я установил первую ссылку для перехода к новому контроллеру представления, и она показывается в течение нескольких секунд, а затем исчезает.

enter image description here

Ответы [ 3 ]

5 голосов
/ 07 мая 2019

Вы используете другой идентификатор для метода segue,

performSegue(withIdentifier: "showScanBarcode", sender: nil)

AND

prepare(for segue: UIStoryboardSegue, sender: Any?).

Поэтому, пожалуйста, используйте тот же идентификатор,Надеюсь, это поможет вам.

0 голосов
/ 07 мая 2019

Это проблема с 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")
    })
0 голосов
/ 04 мая 2019

Похоже, вы сохраняете action1 в manager, и это локально для этой функции. Итак, после того, как функция завершит выполнение, manager и ее содержимое выйдут из области видимости и получат сборщик мусора.

Чтобы обойти это, объявите manager как переменную экземпляра в классе (вне функции). Например:

class TabBarController: UITabBarController, UITabBarControllerDelegate {
   let manager = PopMenuManager.default
   ...
   func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
      ...
      manager.addAction(action1)
   }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...