UIBarButton нажмите, чтобы установить значение флага, используя Swift 4.2 - PullRequest
0 голосов
/ 20 февраля 2019

Мой сценарий, у меня два UIBarButton с действием method. Здесь, когда я нажимаю кнопку Done и Cancel, я перехожу к другой ViewController.После того, как пользователь нажал кнопку «Готово» barbutton, мне нужно установить какое-либо значение флага и проверить его, щелкнув или не щелкнув другой ViewController для button.

My ViewController One *

let barButtonItem = UIBarButtonItem(image: UIImage(named: "backImgs"),
                                            style: .plain,
                                            target: self,
                                            action: #selector(menuButtonTapped))
self.navigationItem.rightBarButtonItem = barButtonItem

@objc fileprivate func menuButtonTapped() { // here I need to set flag value }

My ViewController Two

class ViewControllertwo: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        //Here need to validate flag values to button clicked or not 
    }
}

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Как я понимаю ваш вопрос, решение - -

ViewContorllerOne

class ViewControllerOne : UIViewController {

    var isMenubuttonTapped : Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()

        self.actionToPushOnViewControllerTwo()

        NotificationCenter.default.addObserver(self, selector: #selector(actioFire), name: NSNotification.Name.init("MenuButtonTapped"), object: nil)
    }

    //Call from any where in viewControllerOne
    func actionToPushOnViewControllerTwo() {
        let viewControllerTwo : ViewControllerTwo = self.storyboard?.instantiateViewController(withIdentifier: "ViewControllerTwo") as! ViewControllerTwo
        self.present(viewControllerTwo, animated: true, completion: nil)
    }

    @objc func actioFire(_ notification: Notification) {
        print(notification.userInfo!["isMenuButtonTapped"] as Any)

        if let isMenuButtonTapped = notification.userInfo!["isMenuButtonTapped"] as? Bool {
            self.isMenubuttonTapped = isMenuButtonTapped
        }
    }
}

ViewControllerTwo

class ViewControllerTwo : UIViewController {

        override func viewDidLoad() {
            super.viewDidLoad()

            let barButtonItem = UIBarButtonItem(image: UIImage(named: "backImgs"),
                                                style: .plain,
                                                target: self,
                                                action: #selector(menuButtonTapped))
            self.navigationItem.rightBarButtonItem = barButtonItem
        }

        @objc fileprivate func menuButtonTapped() {
            // here I need to set flag value

            self.dismiss(animated: true) {
                NotificationCenter.default.post(name: Notification.Name("MenuButtonTapped"),
                                                object: nil,
                                                userInfo:["isMenuButtonTapped": true])
            }
        }
    }

Другое простое решение -

self.dismiss(animated: true) {
            if let tabController = self.presentingViewController as? UITabBarController {
                if let navController = tabController.selectedViewController as? UINavigationController {
                    if let secondTab = navController.viewControllers.first as? HomeViewController {
                        secondTab.tfData = "YES"
                    }
                } else {
                    if let secondTab = tabController.selectedViewController as? HomeViewController {
                        secondTab.tfData = "YES"
                    }
                }
            }
        }
0 голосов
/ 20 февраля 2019

Трудно сказать по вашему вопросу, но, если вы представляете ViewControllerOne из ViewControllerTwo, вы захотите использовать для этого шаблон делегата.Это похоже на то, как вы используете представления таблиц / коллекций, и вы по сути указываете ViewControllerTwo делегата ViewControllerOne, чтобы он мог реагировать на нажатие кнопок.

Начните с создания протокола, определяющего сообщения, которыеViewControllerOne может отправить своему делегату:

protocol ViewControllerOneDelegate: AnyObject {
  func viewControllerOneDidTapDone(_ viewController: ViewControllerOne)
  func viewControllerOneDidTapCancel(_ viewController: ViewControllerOne)
}

Затем расширьте ViewControllerTwo для реализации вашего протокола:

extension ViewControllerTwo: ViewControllerOneDelegate {
  func viewControllerOneDidTapDone(_ viewController: ViewControllerOne) {
    // Set your flag or do whatever you need to do on 'Done'.
    // Then dismiss viewController.
  }
  func viewControllerOneDidTapCancel(_ viewController: ViewControllerOne) {
    // Dismiss viewController
  }
}

В ViewControllerOne сохраните делегат как слабое свойство и вызовите методы делегата для кнопкинажмите:

class ViewControllerOne: UIViewController {
  weak var delegate: ViewControllerOneDelegate?

  @objc private func donePressed() {
    delegate?.viewControllerOneDidTapDone(self)
  }

  @objc private func cancelPressed() {
    delegate?.viewControllerOneDidTapCancel(self)
  }
}

Наконец, где-то в ViewControllerTwo, вам нужно установить себя в качестве делегата ViewControllerOne.Вероятно, это будет при создании ViewControllerOne:

class ViewControllerTwo: UIViewController {
  ...

  private func presentViewControllerOne() {
    let viewControllerOne = ViewControllerOne(nibName:nil, bundle: nil)
    viewControllerOne.delegate = self
    // Present or push viewControllerOne
  }

  ...
}
0 голосов
/ 20 февраля 2019

Я частично понимаю ваш вопрос, здесь вам нужно использовать концепцию tag, например,

 override func viewDidLoad() {
    super.viewDidLoad()
let barButtonItem = UIBarButtonItem(image: UIImage(named: "backImgs"),
                                        style: .plain,
                                        target: self,
                                        action: #selector(menuButtonTapped(_:)))
    barButtonItem.tag = 20
    let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(menuButtonTapped(_:)))
    cancelButton.tag = 10
    self.navigationItem.rightBarButtonItem = barButtonItem
    self.navigationItem.leftBarButtonItem = cancelButton
   }

обрабатывать вашу целевую функцию как

  @objc fileprivate func menuButtonTapped(_ sender: UIBarButtonItem) {
  // if you dont want the tag concept, use title property for check which button tapped  //print("get Tapped button title  == \(sender.title)")
    //if sender.tag == 20{
        // clicked for another VC button, add your segue code here
   // }else{
        // pressed cancel button
   // }
     let vcTwo = self.storyboard?.instantiateViewController(withIdentifier: "ViewControllertwo") as! ViewControllertwo
    vcTwo.getSelectedTag = sender.tag
    self.navigationController?.pushViewController(vcTwo, animated: true)

}

на вашем VC2создайте один глобальный Int для получения тега, откуда он взялся,

** ViewControllertwo **

class ViewControllertwo : UIViewController {

    var getSelectedTag   = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        if getSelectedTag == 20 {
            //pressed menu Tapped
        }
    }
}
...