Как я могу переопределить метод просмотра в контроллере?

#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

Изображение ReusableCell.xib

Ответ №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 к обратному вызову, как на этом рисунке:
введите описание изображения здесь

  1. запустите и нажмите на кнопку и посмотрите печать следующим образом: введите описание изображения здесь

весь код для 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. Это работает!!! Большое вам спасибо. Я продолжу просматривать код, который вы мне рассказали, и изучу его. Надеюсь, у вас хороший день 🙂