我正在开发原型阶段的应用程序.某些界面元素没有通过故事板或以编程方式分配给它们的任何操作.
根据UX准则,我想在应用程序中找到这些“非活动”按钮,并在测试期间点击时显示“功能不可用”警报.这可以通过扩展UIButton来完成吗?
解决方法
那么你想要实现的目标是什么.我已经使用UIViewController扩展并添加了一个闭包作为没有目标的按钮的目标.如果按钮没有动作,则会显示警报.
- class ViewController: UIViewController {
- override func viewDidLoad() {
- super.viewDidLoad()
- self.checkButtonAction()
- }
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- // Dispose of any resources that can be recreated.
- }
- override func viewDidAppear(_ animated: Bool) {
- super.viewDidAppear(animated)
- }
- @IBAction func btn_Action(_ sender: UIButton) {
- }
- }
- extension UIViewController{
- func checkButtonAction(){
- for view in self.view.subviews as [UIView] {
- if let btn = view as? UIButton {
- if (btn.allTargets.isEmpty){
- btn.add(for: .touchUpInside,{
- let alert = UIAlertController(title: "Test 3",message:"No selector",preferredStyle: UIAlertControllerStyle.alert)
- // add an action (button)
- alert.addAction(UIAlertAction(title: "OK",style: UIAlertActionStyle.default,handler: nil))
- // show the alert
- self.present(alert,animated: true,completion: nil)
- })
- }
- }
- }
- }
- }
- class ClosureSleeve {
- let closure: ()->()
- init (_ closure: @escaping ()->()) {
- self.closure = closure
- }
- @objc func invoke () {
- closure()
- }
- }
- extension UIControl {
- func add (for controlEvents: UIControlEvents,_ closure: @escaping ()->()) {
- let sleeve = ClosureSleeve(closure)
- addTarget(sleeve,action: #selector(ClosureSleeve.invoke),for: controlEvents)
- objc_setAssociatedObject(self,String(format: "[%d]",arc4random()),sleeve,objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
- }
- }
我测试了它.希望这可以帮助.快乐的编码.