Я веб-разработчик и новичок в программировании на iOS.
У меня есть два файла. ViewController.swift
и FilterList.swift
. Когда я нажал Commend + R
, симулятор вышел, и стиль казался правильным. Но нажатие на FilterList
представление экземпляра ничего не печатало.
Как я могу заставить это работать? Я просто хочу иметь один компонент пользовательского интерфейса и его события в одном представлении. Нечто подобное в текущей разработке Front-End, такой как React и Vue. Или есть какие-то предпочтительные способы справиться с этим?
ViewController.swift
:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let kindsList = FilterList()
view.isUserInteractionEnabled = true
view.backgroundColor = .blue
kindsList.handleTapGesture = {(sender: UITapGestureRecognizer ) -> Void in
print("In UIViewController")
}
view.addSubview(kindsList)
}
}
FilterList.swift
:
import UIKit
class FilterList: UIView {
private let titleBarStackView = UIStackView()
private let titleBarImage = UIImage(systemName: "chevron.right", withConfiguration: UIImage.SymbolConfiguration(pointSize: 16, weight: .regular, scale: .medium))
private let titleBarImageView = UIImageView()
private let titleBarLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 160, height: 28))
// MARK:- Styles
private let spacing: CGFloat = 16.0
var labelText = "title"
var handleTapGesture: ((UITapGestureRecognizer) -> Void)?
convenience init(label: String) {
self.init()
self.labelText = label
// Tap Gesture
let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap))
titleBarStackView.addGestureRecognizer(tap)
titleBarStackView.isUserInteractionEnabled = true
self.isUserInteractionEnabled = true
}
override func layoutSubviews() {
super.layoutSubviews()
// Do any additional setup after loading the view.
// Configure Arrow
titleBarImageView.image = titleBarImage
// Configure Label
titleBarLabel.text = labelText
titleBarLabel.font = UIFont.preferredFont(forTextStyle: .headline)
titleBarStackView.addArrangedSubview(titleBarLabel)
titleBarStackView.addArrangedSubview(titleBarImageView)
self.addSubview(titleBarStackView)
setupConstraints()
}
private func setupConstraints() {
titleBarStackView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
titleBarStackView.leadingAnchor.constraint(equalTo: self.superview!.safeAreaLayoutGuide.leadingAnchor, constant: spacing),
titleBarStackView.trailingAnchor.constraint(equalTo: self.superview!.safeAreaLayoutGuide.trailingAnchor, constant: -spacing),
titleBarStackView.topAnchor.constraint(equalTo: self.superview!.safeAreaLayoutGuide.topAnchor, constant: spacing),
])
}
@objc func handleTap(_ sender: UITapGestureRecognizer) {
print("IN UIView")
self.handleTapGesture?(sender)
}
}