addTarget() 不适用于自定义扩展

YakuzaNY

我做了一个自定义UIView(),我正在尝试向它添加一个 okButton。

然而。我已经添加了按钮,但是在我的一个 ViewControllers 中显示我的 UIView 时,但该按钮不起作用。这是我的代码:

class Luna: UIView {

let luna = UIView()
let okButton = UIButton()
typealias completionHandler = (_ success:Bool) -> Void


// Not yet implemented
open var touchOutsideToHide: Bool = true;

private var screenWidth: CGFloat {
    return UIScreen.main.bounds.width
}


override init(frame: CGRect) {
    super.init(frame: frame)
    okButton.setTitleColor(.blue, for: .normal)
    okButton.setTitle("Okay", for: .normal)
    okButton.titleLabel?.font = UIFont(name: "avenirnext-demibold", size: 16)

    let gesture:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.pressButton(_:)))
    okButton.addGestureRecognizer(gesture)
}

required public init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

}

}

 //The target function
@objc func pressButton(_ sender: UIButton){ //<- needs `@objc`
    // .. //
    print("btn hit")
}

我没有进入btn hit控制台并且水龙头没有注册

该按钮是可见的,它被添加为一个子视图:截图

萨加·乔汉

按钮有默认的触摸手势,你不需要添加它。只需添加如下目标即可解决您的问题。创建您的客户类的协议并在同一个类中为其声明委托,如下所示。

protocol LunaDelegate: class {
    func okButtonTapped(sender: UIButton)
}

class Luna: UIView {

    let luna = UIView()
    let okButton = UIButton()
    typealias completionHandler = (_ success:Bool) -> Void

    weak var delegate: LunaDelegate?

    // Not yet implemented
    open var touchOutsideToHide: Bool = true;

    private var screenWidth: CGFloat {
        return UIScreen.main.bounds.width
    }


    override init(frame: CGRect) {
        super.init(frame: frame)
        okButton.setTitleColor(.blue, for: .normal)
        okButton.setTitle("Okay", for: .normal)
        okButton.titleLabel?.font = UIFont(name: "avenirnext-demibold", size: 16)
        okButton.addTarget(self, action: #selector(pressButton(sender:)), for: .touchUpInside)
}

@IBAction func pressButton(sender: UIButton) {
    if let selfDelegate = self.delegate {
        selfDelegate.okButtonTapped(sender: sender)
    }
}

required public init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    }
}

然后按照以下方式实现您的代码以使用您的自定义视图。当您按下按钮时,将在您的视图控制器中调用委托方法。

用法:

class LunaViewController: UIViewController, LunaDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let luna = Luna(frame: CGRect.init(x: 100, y: 100, width: 100, height: 40))
        luna.delegate = self
        self.view.addSubview(luna)
    }

    // MARK:- Luna Delegate
    func okButtonTapped(sender: UIButton) {
        print("OK Button Pressed From Luna View")
    }
}

这是我在当前项目中已经使用的正确解决方案。我希望这能帮到您。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

UIButton addTarget不适用于iOS7,但可在IOS6中使用

来自分类Dev

自定义主题不适用于FragmentActivity

来自分类Dev

attachmentButtonTappedForRowWithIndexPath不适用于自定义按钮或标签

来自分类Dev

setText不适用于自定义Edittext

来自分类Dev

PHPHtmlParser getAttribute不适用于自定义属性

来自分类Dev

prepareForSegue不适用于自定义segue(快速)

来自分类Dev

自定义绑定动画不适用于foreach

来自分类Dev

UIButton不适用于自定义UITableViewCell(Swift)

来自分类Dev

AutoCompleteTextView不适用于自定义ArrayAdapter

来自分类Dev

setMargins方法不适用于自定义ViewGroup

来自分类Dev

Django自定义命令不适用于args

来自分类Dev

Xamarin样式不适用于自定义视图

来自分类Dev

我的自定义主题不适用于按钮

来自分类Dev

CSS不适用于自定义fxml组件

来自分类Dev

自定义主题不适用于FragmentActivity

来自分类Dev

prepareForSegue不适用于自定义segue(快速)

来自分类Dev

setMargins方法不适用于自定义ViewGroup

来自分类Dev

SVProgressHUD关闭不适用于自定义类

来自分类Dev

设置操作不适用于自定义对象

来自分类Dev

分页不适用于自定义重写规则

来自分类Dev

自定义字体不适用于大小类

来自分类Dev

JsGrid 排序不适用于自定义列

来自分类Dev

流程:细化不适用于自定义类型

来自分类Dev

字母顺序不适用于自定义 ListView

来自分类Dev

isGranted 不适用于自定义角色名称

来自分类Dev

抽屉仅适用于AppBar,不适用于自定义App Bar

来自分类Dev

抽屉仅适用于AppBar,不适用于自定义App Bar

来自分类Dev

自定义存档页面不适用于日期或标签,但适用于类别

来自分类Dev

用于boost program_options的自定义验证器不适用于GCC,不适用于MSVC

Related 相关文章

热门标签

归档