我有一个UIButton,我放在一个不同于它声明的UIView但是我希望目标选择器在UIView中我声明了按钮。由于按钮正在调用init_button函数放在视图上。这就是我所拥有的:
import Foundation
import UIKit
class Menu1 : Element {
var color_base = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)
var mock : UIView = UIView()
var button : UIButton = UIButton()
var view_width: CGFloat = 0,
view_height: CGFloat = 0,
menu_vertical_buffer : CGFloat = 0,
menu_width : CGFloat = 0,
button_vertical_buffer : CGFloat = 0,
button_width : CGFloat = 0
required init(mock: UIView) {
super.init(mock: mock)
self.mock = mock
init_dims()
init_button()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func init_dims(){
view_width = mock.frame.width
view_height = mock.frame.height
menu_vertical_buffer = CGFloat(floor(Double(view_height/17.5)))
menu_width = CGFloat(floor(Double(view_width/2.67)))
button_vertical_buffer = CGFloat(floor(Double(menu_vertical_buffer/3.6)))
button_width = menu_width - CGFloat(floor(Double(menu_width/7)))
}
func init_button(){
button = UIButton(frame: CGRect(x: mock.frame.width - menu_width,
y: mock.frame.height - (menu_vertical_buffer + (2 * button_vertical_buffer)),
width: button_width,
height: menu_vertical_buffer))
button.backgroundColor = color_base
button.layer.cornerRadius = button.frame.height/2
button.addTarget(self, action: #selector(changeMenuState), for: .touchUpInside)
mock.addSubview(button)
}
dynamic func changeMenuState(){
print("Menu state changed")
}
}
changeMenuState
是我作为目标选择器添加的函数,但按钮位于视图mock
中,而不是在这些函数所在的视图中。
答案 0 :(得分:0)
changeMenuState必须是动态的,或@objc暴露为
@objc func changeMenuState(){
print("Menu state changed")
}
答案 1 :(得分:0)
我最好的猜测是这可能是一个范围问题。您没有显示按钮的存储位置或范围的生命周期。在典型的场景中,您将在viewcontroller(或可能是单元格)中定义一个按钮,如下所示:
class MyViewController: UIViewController {
var button: UIButton? = nil
override func viewDidLoad() {
super.viewDidLoad()
init_button()
}
}
这样,只要视图控制器在范围内,按钮就会保持在范围内。您的代码看起来有效,所以我的“最佳猜测”是对按钮的引用超出了范围。
您可能需要更深入地了解这些视图如何协同工作以及它们的生命周期范围(如果此评论对您没有帮助)。
答案 2 :(得分:0)
答案 3 :(得分:0)
您编写的代码是正确的,我已尝试过相同的代码。我发现的问题是你的按钮出现在屏幕上但是超出了模拟视图的界限,因此按钮无法接收到触摸事件。尝试通过正确设置框架将按钮放在模拟视图边界内。
答案 4 :(得分:0)
我能够解决问题,这是一个范围问题。我从来没有将Menu1类添加到模拟类或任何其他视图中,因此我相信在实例化并放置按钮后,该实例被杀死,因此按钮被放置但目标位于不再使用的类中。什么解决了我的问题是将mock.addSubview(self)
添加到此类。