UIBarButton单击以使用Swift 4.2设置标志值

问题描述 投票:0回答:3

我的情景,我有两个UIBarButton与行动method,在这里,每当我点击DoneCancel按钮我移动到另一个ViewController。一旦用户点击了完成barbutton,我需要设置一些标志值并验证另一个用于点击或未点击的button的ViewController。

我的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 }

我的ViewController二

class ViewControllertwo: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        //Here need to validate flag values to button clicked or not 
    }
}
ios swift3 uibarbuttonitem
3个回答
1
投票

我部分理解你的问题,在这里你需要使用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
        }
    }
}

0
投票

从您的问题中很难说,但假设您从ViewControllerTwo呈现ViewControllerOne,您将需要使用委托模式。这与您使用表/集合视图的方式类似,并且您实际上是在告诉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
投票

据我了解你的问题,解决方案是 -

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"
                    }
                }
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.