我想在其他视图的子视图中添加点击,但我的当前方法不会被调用,即当我的座位在handleTap函数中被编码时,我的座位不会被打印。我已根据以下post和this修改了我的方法。到目前为止我的代码:
//My viewController
class ViewController: UIViewController, UIScrollViewDelegate {
let scrollView = UIScrollView()
let cinema: CinemaView = {
let v = CinemaView()
return v
}()
override func viewDidLoad() {
super.viewDidLoad()
let seat1 = SeatView()
seat1.isVacant = false
seat1.seatNumber = "2A"
let seat2 = SeatView()
seat2.isVacant = true
seat2.seatNumber = "3B"
cinema.seats = [seat1, seat2]
let tap = UITapGestureRecognizer(target: seat1, action: #selector(handleTap))
seat1.addGestureRecognizer(tap)
seat1.isUserInteractionEnabled = true
view.addSubview(scrollView)
scrollView.addSubview(cinema)
}
@objc func handleTap(_ seat: SeatView) {
if let seatNumber = seat.seatNumber {
print("\(seatNumber) is tapped")
} else {
print("Seat tapped")
}
}
//My custom cinemaView
class CinemaView: UIView {
var seats = [SeatView]() {
didSet {
for v in self.subviews {
v.removeFromSuperview()
}
var seatRect = CGRect(x: 0, y: 0, width: 20, height: 20)
for seat in seats {
self.addSubview(seat)
seat.frame = seatRect
seatRect.origin.x += seatRect.size.width + 8
}
}
}
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
//My Custom seatView
class SeatView: UIView {
var isVacant: Bool = true
var seatNumber: String?
override init(frame: CGRect) {
super.init(frame: frame)
}
}
注意:上面已经省略了一些样板代码,以使代码简洁明了。
我首选的方法是在VC中添加这些选项,以便我可以将此信息传递到另一个VC并推送到Firebase。任何建议将不胜感激
编辑:添加了UI的截图
答案 0 :(得分:0)
在3stud1ant3的帮助下,我设法弄清楚哪里出了问题。
观察视图布局后,即使添加了seatViews,电影院也从未添加到视图中。通过在viewController的viewDidLoad中为cinemaView定义更多约束,并在下面的答案文章中加入3stud1ant3的代码,点击功能起作用。
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .blue
cinema.seats = [seatView1, seatView2]
view.addSubview(scrollView)
scrollView.addSubview(cinema)
let views = ["scrollView": scrollView, "v": cinema] as [String : Any]
let screenHeight = view.frame.height
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[scrollView(\(screenHeight / 2))]", options: NSLayoutFormatOptions(), metrics: nil, views: views))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[scrollView]|", options: NSLayoutFormatOptions(), metrics: nil, views: views))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-60-[v(50)]", options: NSLayoutFormatOptions(), metrics: nil, views: views))
//Previously, the below constraints were not added. Once these are added, the tap function works
cinema.leftAnchor.constraint(equalTo: scrollView.leftAnchor).isActive = true
cinema.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
cinema.widthAnchor.constraint(equalTo: scrollView.widthAnchor ,constant: 100).isActive = true
}