Ios 将点击手势添加到任何视图都不会触发任何动作

Ios 将点击手势添加到任何视图都不会触发任何动作,ios,swift,swift3,uikit,uitapgesturerecognizer,Ios,Swift,Swift3,Uikit,Uitapgesturerecognizer,在我的iOS开发之旅中,我正在处理一个迄今为止最令人沮丧的问题。我本来想在我的UIImage视图中添加一个手势识别器,但没有成功。我在堆栈上做了一些搜索,发现我没有设置imageView.isUserInteractionEnabled=true,我认为这可以解决我的问题,但它没有。于是我开始在所有东西中添加手势识别器,包括imageView的父视图,但仍然一无所获。我确信我正在做/没有做的事情很简单,但我完全错过了。请帮忙 ProfileViewController: UIViewContro

在我的iOS开发之旅中,我正在处理一个迄今为止最令人沮丧的问题。我本来想在我的
UIImage
视图中添加一个手势识别器,但没有成功。我在堆栈上做了一些搜索,发现我没有设置
imageView.isUserInteractionEnabled=true
,我认为这可以解决我的问题,但它没有。于是我开始在所有东西中添加手势识别器,包括
imageView
的父视图,但仍然一无所获。我确信我正在做/没有做的事情很简单,但我完全错过了。请帮忙

ProfileViewController: UIViewController {

    // User's info container (Parent iof imageView)
let userInfoContainer: UIView = {
    let head = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    head.backgroundColor = UIColor.white
    head.translatesAutoresizingMaskIntoConstraints = false
    head.layer.borderWidth = 1
    print(head.isUserInteractionEnabled) // Returns true
    let tap = UITapGestureRecognizer(target: self, action: #selector(tapped))
    head.addGestureRecognizer(tap)
    return head
}()
// Users name
let userName: UITextField = {
    let name = UITextField()
    name.text = "John Doe"
    name.translatesAutoresizingMaskIntoConstraints = false
    name.isUserInteractionEnabled  = true
    let tap = UITapGestureRecognizer(target: self, action: #selector(tapped))
    name.addGestureRecognizer(tap)
    return name
}()

    // User's profile image
let profileImageView: UIImageView = {
    let imageView = UIImageView(image: #imageLiteral(resourceName: "avatar"))
    imageView.layer.cornerRadius = 50
    imageView.layer.masksToBounds = true
    imageView.translatesAutoresizingMaskIntoConstraints = false
    imageView.isUserInteractionEnabled = true
    imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapped)))
    return imageView
}()
//
//
// skipping other UI elements
//
//
override func viewDidLoad() {
    super.viewDidLoad()
    // Authentication bits

    self.title = "Profile View"
    self.view.backgroundColor = UIColor.white
    self.view.addSubview(userInfoContainer)
    self.view.addSubview(profileImageView)
    self.view.addSubview(userName)
    } // end viewDidLoad
func tapped() {
    print(123)
}

// setup constraints
func setupUserInfoContainer() {
    userInfoContainer.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    userInfoContainer.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
    userInfoContainer.heightAnchor.constraint(equalToConstant: 200).isActive = true
}
// profile image arrangement
func setupProfileImage() {
    profileImageView.leftAnchor.constraint(equalTo: userInfoContainer.leftAnchor, constant: 20).isActive = true
    profileImageView.centerYAnchor.constraint(equalTo: userInfoContainer.centerYAnchor).isActive = true
    profileImageView.heightAnchor.constraint(equalToConstant: 100).isActive = true
    profileImageView.widthAnchor.constraint(equalToConstant: 100).isActive = true

}

func setupLabels() {
    userName.leftAnchor.constraint(equalTo: profileImageView.rightAnchor, constant: 20).isActive = true
    userName.centerYAnchor.constraint(equalTo: profileImageView.centerYAnchor).isActive = true
    userName.heightAnchor.constraint(equalToConstant: 20).isActive = true
    userName.isEnabled = false
}
} // end view controller
渲染视图: 视图层次结构 可能不需要的额外信息:ProfileViewController由UITabBarController处理,但从我所看到的情况来看,这不会有什么区别

更新 环顾四周,它看起来像是合适的swift 3语法
让tap=uitappesturerecognizer(目标:self,动作:#选择器(self.tapped(:))
但是我认为在闭包中有那一行是导致抛出此错误的原因。
。/ProfileViewController.swift:37:74:type的值“(NSObject)->()->ProfileViewController”没有成员“tapped”


如果有人能解释我如何解决这一问题,那将是一件大事。

问题是你没有将委托设置为点击手势。检查


希望这能起作用

我不相信你能以这种方式分配手势识别器

1 let profileImageView: UIImageView = {
2     let imageView = UIImageView(image: #imageLiteral(resourceName: "avatar"))
3     imageView.layer.cornerRadius = 50
4     imageView.layer.masksToBounds = true
5     imageView.translatesAutoresizingMaskIntoConstraints = false
6     imageView.isUserInteractionEnabled = true
7     imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapped)))
8     return imageView
9 }()
在第7行,什么是
self
?它是返回
UIImageView
的函数

您的
func tapped()
不是该函数的一部分。。。它属于
ProfileViewController

你也许能找到一种改变目标的方法,但几分钟的尝试并没有给我带来任何运气


我认为您需要在
ProfileViewController/viewDidLoad()
(或该类中的其他地方)中创建并添加手势识别器。

为什么不在类的顶部初始化图像视图,如

 let profileImageView = UIImageView()
并创建一个函数来配置imageview,并将其添加为子视图,如在view中加载。这应该行得通

func configureImageView() { 
    #add methods and customize image view
    #add image view to sub view 
} 

那是行不通的。从闭包内部添加
tap.delegate=self
尝试设置
UIgestureRecognitizerDelegate?=ProfileViewController
您可以尝试将点击的签名更改为点击的(u发送者:任意)并在选择器中将其更改为点击的(u:)?我更改了签名,但仍然收到上面列出的错误@ConnorGCheck如果用户交互已启用viewcontoller的view或使用view调试器进行检查,则该视图上可能存在背景清晰的内容
self.view.isUserInteractionEnabled
返回true@TikoAhhh,因此self在上下文中引用UIImageView而不是ProfileViewController。将该线拉入viewDidLoad会更改对视图控制器的引用。我理解正确吗?是的。。。在你的上下文中,self甚至不是UIImageView。。。它是返回UIImageView的函数。另一部分,是的。。。内部viewDidLoad“self”将指的是ViewController。