代码之家  ›  专栏  ›  技术社区  ›  Rakesha Shastri

将传递给方法的选择器指定为按钮目标操作

  •  0
  • Rakesha Shastri  · 技术社区  · 8 年前

    这是我的设想。我在举杯庆祝。toast视图接受一个选择器,它将该选择器设置为toast视图内按钮的目标操作。但我得到了无法识别的选择器错误。

     // MainViewController.swift
    
     func viewDidLoad() {
    
         // Custom initializer for toastview
         let toastView = ToastView(view: nil, selector: #selector(testSelector))
         .
         .
         .
     }
    
     @objc func testSelector() {
          print("Test")
     }
    
     // ToastView.swift
    
     var selector: Selector
    
     convenience init(view: UIView, selector: Selector) {
          self.selector = selector
          let button = UIButton(type: .system)
          button.addTarget(self, action: self.selector, for: .touchUpInside)
     }
    

    编辑:稍微修改了代码,以反映原始代码中的实际内容。

    3 回复  |  直到 8 年前
        1
  •  2
  •   Bilal hao zou    8 年前

    你找错目标了。目标必须是定义选择器(方法或函数)的类的对象。如果在 MainViewController 目标必须是的对象 主视图控制器 . 如果函数在中定义,则相同 ToastView 选择器必须是的对象 Toast视图 .

    要么你移动你的 testSelector 在您的 Toast视图 上课,其余的保持不变。

    选项1

    // something like this 
    class ToastView {
        @objc func testSelector() {
            print("Test")
        } 
    }
    

    选项2

    或者将目标传递为 init 参数。

    // ToastView.swift
    convenience init(view: UIView, target:Any, selector: Selector) {
        let button = UIButton(type: .system)
        button.addTarget(target, action: selector, for: .touchUpInside)
    }
    

    在你的 主视图控制器 像这样称呼它。

    func viewDidLoad() {
    
       // Custom initializer for toastview
       let toastView = ToastView(view: nil, target:self, selector: #selector(testSelector))
        .
        .
        .
    }
    
        2
  •  1
  •   RajeshKumar R    8 年前

    你应该走了 testSelector 到您的 ToastView 如果要在中执行操作,请初始化 Toast视图

    如果要在中执行操作 MainViewController 然后使用自定义委托。

    或声明 button 中全局变量 Toast视图 班然后您可以将target添加到 主视图控制器 使用

    let toastView = ToastView()
    toastView.button.addTarget(target, action: selector, for: .touchUpInside)
    

    可以对按钮操作使用闭包,而不是选择器

    class ToastView: UIView {
        let button = UIButton()
        var btnAction:((Void) -> Void)?
    
        convenience init(_ btnAction: @escaping (Void) -> Void) {
            self.init()
            self.btnAction = btnAction
        }
    
        private init() {
            super.init(frame: .zero)
            button.addTarget(self, action: #selector(callbackButton(_:)), for: .touchUpInside)
        }
    
        func callbackButton(_ id:Any) -> Void {
            if self.btnAction != nil {
                self.btnAction!()
            }
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    }
    

    在MainViewController中。敏捷的

    func viewDidLoad() {
    
         // Custom initializer for toastview
         let toastView = ToastView.init( {(Void) -> Void in
            print("test")
        })
     }
    
        3
  •  -1
  •   Saheb Roy    8 年前

    不要传递选择器,相反,根本不需要传递任何选择器。 按下按钮时发出通知,并在控制器的通知中添加观察员。在与观察器连接的选择器中执行任何操作