【问题标题】:My UIButton doesn't call the method targeted我的 UIButton 没有调用目标方法
【发布时间】:2017-08-20 08:30:53
【问题描述】:

我真的不知道#selector 有什么问题:

func iterate() {
    scrollView.subviews[0].subviews[0].addSubview(arrowButton)
    arrowButton.addTarget(self, action: #selector(self.pressButton), for: .touchUpInside)
    self.view.bringSubview(toFront: arrowButton)
}

func pressButton() {
    print("pouet pouet pouet")
}

override func viewDidLoad() {
    super.viewDidLoad()
    iterate()
}

(不要介意布局问题,为了清楚起见,我已经删除了所有约束)

当我按下按钮时,什么也没有打印出来。

我对那个#selector 越来越疯狂了,这么重要的开发部分怎么还在使用这个 ObjC 垃圾?

编辑:我的 UIBUtton 位于所有层之上,或者至少 XCode 调试工具是这样说的(按钮在右下角)=

【问题讨论】:

  • 我看不出有什么问题。试试不带self.pressButton
  • 我已经尝试过,我已经尝试过我可以在网上找到的所有语法,但没有任何效果......每次我必须使用 #selector 时,我都会浪费至少半天的时间,说真的......
  • 其实问题可能不在选择器上。它可能完全在其他地方。检查是否调用了viewDIdLoad
  • 由于我的 Button 和 viewDidLoad 中的所有内容都显示出来了,我想我的 viewDidLoad 被调用了,不是吗?我在里面放了一个 print() ,它也出现了。
  • 好的。我建议你在 Xcode 中创建一个新项目,并尝试用尽可能短的代码重现这个问题。然后在这里发布。还包括您执行的其他步骤。

标签: swift uibutton selector


【解决方案1】:

我认为这一行有错误 (scrollView.subviews[0].subviews[0].addSubview(arrowButton))

可能是您在 View jsut check 下添加的按钮

func iterate() {
    scrollView.subviews[0].subviews[0].addSubview(arrowButton)
    arrowButton.addTarget(self, action: #selector(self.pressButton), for: .touchUpInside)
}

func pressButton() {
    print("pouet pouet pouet")
}

override func viewDidLoad() {
    super.viewDidLoad()
    iterate()
}

【讨论】:

  • 我怀疑过,但我已经添加了 self.view.bringSubview(toFront: arrowButton),并且我已经检查了 XCode 调试工具(参见编辑),它绝对是最重要的......
  • 你是加了arrowButton框架吗,你是不是用了约束,只为UIbutton设置框架
  • 我正在使用约束,但话又说回来,Z、Y 或 X 中的按钮位置、高度或宽度绝对没问题,xcode 不会抱怨布局和一切在模拟器中没问题。只是这个 M********ing #selector…
【解决方案2】:

可能是因为语法有问题。试试这个...

arrowButton.addTarget(self, action: #selector(pressButton(_:)), for: .touchUpInside)

对于触摸动作...

func pressButton(_ sender : UIButton){

 print("Button Tapped")
 }

【讨论】:

  • 嗯...尝试添加这个 ....arrowButton.addTarget(self, action: #selector(pressButton(sender:)), for: .touchUpInside)
【解决方案3】:

1.只是为了调试问题不是因为view hierarchy,请尝试替换这行代码:

scrollView.subviews[0].subviews[0].addSubview(arrowButton)

self.view.addSubview(arrowButton)

2.检查您的arrowButton 的以下属性未在您的代码中某处设置为false

isEnabled, isUserInteractionEnabled

这两个属性必须是truearrowButton 才能接收touch events

3.检查您的arrowButton顶部是否未添加任何其他视图。

4. 您提供的selector 没有问题。它工作得很好。我使用了下面的代码,它对我有用:

func iterate()
{
    let arrowButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    arrowButton.backgroundColor = .red
    self.view.addSubview(arrowButton)
    arrowButton.addTarget(self, action: #selector(self.pressButton), for: .touchUpInside)
    self.view.bringSubview(toFront: arrowButton)
}

我认为view hierarchy 在某种程度上导致了这个问题。

【讨论】:

    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多