#ios #swift
#iOS #swift
Вопрос:
Я создал пользовательскую ячейку просмотра, которую нужно использовать повторно. Я хочу добавить действие к кнопке в CustomView, которая показывает боковое меню. Итак, я написал код ReusableCustomView.swift, как показано ниже.
class ResuableCustomView: UIView {
let nibName = "ReusableCustomView"
@IBOutlet weak var categoryMenuBTn: UIButton!
@IBOutlet weak var containerView: UIStackView!
func showMenu(){
print("tapped")
}
@IBAction func menuBtnClicked(_ sender: UIButton) {
self.showMenu()
}
@IBAction func buttonTap(_ sender: UIButton) {
print("Tappedd")
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
func commonInit() {
guard let view = loadViewFromNib() else { return }
view.frame = self.bounds
self.addSubview(view)
}
func loadViewFromNib() -> UIView? {
let nib = UINib(nibName: nibName, bundle: nil)
return nib.instantiate(withOwner: self, options: nil).first as? UIView
}
}
отображение кода SideMenu выглядит следующим образом.
func showSlideMenu(){
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let sideMenuViewController: SideMenuViewController = storyboard.instantiateViewController(withIdentifier: "SideMenuViewController") as! SideMenuViewController
let menu = CustomSideMenuNavigation(rootViewController: sideMenuViewController)
present(menu, animated: true, completion: nil)
}
- Настраиваемый вид добавляется в раскадровку, и пользовательский интерфейс работает хорошо, и я хочу переопределить функцию showMenu, чтобы я мог показывать боковое меню.
Как я могу переопределить эту функцию с помощью кода? Я был бы признателен, если бы вы могли сообщить мне об этом. - Код ViewController приведен ниже:
class categoryToViewController: UIViewController {
@IBOutlet weak var customViewCell: ResuableCustomView!
override func viewDidLoad() {
super.viewDidLoad()
}
}
Изображение раскадровки, которое принимает класс ResuableCustomView
Ответ №1:
Вы можете напрямую добавить действие кнопки menuBtnClicked внутри categoryToViewController, поскольку ReusableCustomView помещается внутри этого ViewController.
class categoryToViewController: UIViewController {
@IBOutlet weak var customViewCell: ResuableCustomView!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func menuBtnClicked(_ sender: Any) {
print("pressed")
}
}
Комментарии:
1. я пытался, но не могу выполнить действие непосредственно в MenuButton. Я прикрепил картинку, к которой я пытался подключиться в этой статье.
2. @lisa Пожалуйста, посмотрите на добавленный gif. Просто нажмите на пустой круг рядом с IBAction и свяжите его с кнопкой.
3. Большое вам спасибо за прикрепление видео в формате gif. Упомянутая вами часть понимается путем наследования ячейки, создания на ней кнопки и ее подключения. Я собираюсь попробовать показать боковое меню в контроллере просмотра при нажатии кнопки, объявленной в CustomViewCell. Я хочу использовать CustomViewCell несколько раз, и с помощью этой кнопки отображается боковое меню для нескольких представлений. Я добавил gif-файл, который показывает мою раскадровку. Спасибо за ответ
4. Я решил проблему. Спасибо за вашу помощь с ответом.
Ответ №2:
сначала вам лучше наследовать от UIControll вместо UIView. Потому что вы можете получить событие.
1- измените определение класса на эту строку:
class ResuableCustomView: UIControl { ... }
2- добавить в UIView пользовательский UIViewController и пользовательский класс sed в ResuableCustomView:
3- создайте функцию в ViewController для получения события:
@IBAction private func customViewTapped(_ sender: ResuableCustomView) {
print("hello my friend :-)")
}
4- внутри класса ResuableCustomView задайте действие, добавив эту строку к вашей функции:
self.sendActions(for: .touchUpInside)
эта строка отправляет событие для использования.
Здесь я использовал тип touchUpInside.
измените свою функцию showMenu на приведенный ниже код:
func showMenu(){
// set here callBack
self.sendActions(for: .touchUpInside) // and create event function with touchUpInside type
print("tapped")
}
5- теперь вернемся к раскадровке и подключим IBAction к обратному вызову, как на этом рисунке:
весь код для CustomView:
// inheritance from UIControl instead of UIView
class ResuableCustomView: UIControl {
let nibName = "ReusableCustomView"
@IBOutlet weak var categoryMenuBTn: UIButton!
@IBOutlet weak var containerView: UIStackView!
func showMenu(){
// set here callBack
self.sendActions(for: .touchUpInside) // and create event function with touchUpInside type
print("tapped")
}
@IBAction func menuBtnClicked(_ sender: UIButton) {
self.showMenu()
}
@IBAction func buttonTap(_ sender: UIButton) {
print("Tappedd")
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
func commonInit() {
guard let view = loadViewFromNib() else { return }
view.frame = self.bounds
self.addSubview(view)
}
func loadViewFromNib() -> UIView? {
let nib = UINib(nibName: nibName, bundle: nil)
return nib.instantiate(withOwner: self, options: nil).first as? UIView
}
}
весь код для ViewController:
class ViewController: UIViewController {
@IBOutlet weak var customViewCell: ResuableCustomView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction private func customViewTapped(_ sender: ResuableCustomView) {
print("hello my friend :-)")
}
}
Комментарии:
1. Это работает!!! Большое вам спасибо. Я продолжу просматривать код, который вы мне рассказали, и изучу его. Надеюсь, у вас хороший день 🙂