Как получить кнопку возврата в нажатом ViewController (Xcode) - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть viewController с кнопкой меню, установленной как navigationItem, например:

self.navigationItem.setLeftBarButton(leftButton, animated: false).

Это вызывает меню ящика, которое хорошо в его контексте. Но что, если я хочу нажать viewController из другого места в проекте, где вместо кнопки меню больше подходит кнопка «Назад»? То есть я просто хочу вернуться к предыдущему viewController вместо вызова меню. Как мне избавиться от кнопки меню и вместо этого получить кнопку назад в этом конкретном случае?

Вот код для класса. Как видите, здесь установлен navigationItem.

override func viewDidLoad() {
    super.viewDidLoad()

    self.setUserInterfaceStyleLight()
    loginStoryboard = UIStoryboard(name: "StoryboardOne", bundle: nil)
    let leftButton = UIBarButtonItem(image: UIImage(named: "menu-icon"), style: .plain, target: self, action:  #selector(self.leftSideMenuButtonPressed(_:)))
    self.navigationItem.setLeftBarButton(leftButton, animated: false)

    self.segmentController.tintColor = .white
    if showContacts == true {
        lastSegmentViewed = 1
    }

    Analytics.logEvent("contact_book", parameters: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(userDidLogin(_:)), name: NSNotification.Name.UserDidLogin, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(applicationAndViewWasResumed(_:)), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil)
    self.view.backgroundColor = ThemTemplate.shared.getThem().secondaryColor

    if #available(iOS 13.0, *) {
        segmentController.backgroundColor = UIColor.gray
    } else {

        segmentController.backgroundColor = UIColor.clear
    }
}

Можно ли скрыть и отключить navigationItem от предыдущего viewController или заменить его кнопкой возврата?

Вот так я нажимаю viewController:

UIStoryboard *containerStoryboard = [UIStoryboard storyboardWithName:@"Login" bundle:nil];
BaseViewController *v = [containerStoryboard instantiateViewControllerWithIdentifier:@"base"];
[self.navigationController pushViewController:v animated:YES];

В классе до толчка к новому viewController Я пробовал что-то вроде:

v.navigationItem.leftBarButtonItem = nil;
v.navigationItem.hidesBackButton = NO;

... который ничего не делал (и да, установка его на ноль глупа, просто хотел посмотреть, если что-то произошло, и этого не произошло).

viewController, который я нажимаю, не встроен в контроллер навигации, если это помогает. Я попытался встроить его в один, но с теми же результатами.

Оставил мне знать, есть ли что-нибудь еще, что может быть полезным.

1 Ответ

0 голосов
/ 04 ноября 2019

Добавьте переменную Bool в BaseViewController:

class BaseViewController: UIViewController {

    var bShowMenu: Bool = true

    override func viewDidLoad() {
        super.viewDidLoad()

        self.setUserInterfaceStyleLight()
        loginStoryboard = UIStoryboard(name: "StoryboardOne", bundle: nil)

        if bShowMenu {
            let leftButton = UIBarButtonItem(image: UIImage(named: "menu-icon"), style: .plain, target: self, action:  #selector(self.leftSideMenuButtonPressed(_:)))
            self.navigationItem.setLeftBarButton(leftButton, animated: false)
        }

        self.segmentController.tintColor = .white
        if showContacts == true {
            lastSegmentViewed = 1
        }

        Analytics.logEvent("contact_book", parameters: nil)

        NotificationCenter.default.addObserver(self, selector: #selector(userDidLogin(_:)), name: NSNotification.Name.UserDidLogin, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(applicationAndViewWasResumed(_:)), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil)
        self.view.backgroundColor = ThemTemplate.shared.getThem().secondaryColor

        if #available(iOS 13.0, *) {
            segmentController.backgroundColor = UIColor.gray
        } else {

            segmentController.backgroundColor = UIColor.clear
        }
    }
}

, а затем, когда вы создадите экземпляр контроллера, скажите ему, следует ли использовать кнопку «меню»:

UIStoryboard *containerStoryboard = [UIStoryboard storyboardWithName:@"Login" bundle:nil];
BaseViewController *v = [containerStoryboard instantiateViewControllerWithIdentifier:@"base"];

// if you do NOT want the menu button
v.bShowMenu = false

[self.navigationController pushViewController:v animated:YES];
...