Как представить контроллер представления с подклассами UIView, UIButton? - PullRequest
0 голосов
/ 17 июня 2020

Итак, я создал этот подкласс UIButton. Это многократно используемый компонент, который можно добавить в любой контроллер представления. Мне нужно представить контроллер представления предупреждений нажатием кнопки. Итак, в основном мне нужно выяснить, в каком контроллере представления находится кнопка, чтобы я мог передать контроллер представления в качестве параметра.

final class ProfileButton: UIButton {

let picker = UIImagePickerController()

lazy var shadowImageView: UIImageView = {
    let imageView = UIImageView()
    imageView.contentMode = .scaleAspectFill
    imageView.image = UIImage(named: "download")
    return imageView
}()

override public init(frame: CGRect) {
    super.init(frame: frame)
    setupSelf()
    self.addTarget(self, action: #selector(profileButtonTapped), for: .touchUpInside)
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
}
override public func layoutSubviews() {
    super.layoutSubviews()
    shadowImageView.layer.cornerRadius = self.frame.width/2.70
    shadowImageView.layer.masksToBounds = true
}

@objc func profileButtonTapped(){
    imageHandler(presenter: )
}

@objc func imageHandler(presenter: UIViewController!){
    let alertController = UIAlertController(title: "Profile Picture", message: "Please select your profile picture", preferredStyle: .alert)
    let okAction = UIAlertAction(title: "Photo Library", style: .default, handler: { (action: UIAlertAction!) in
        print("I am working")
    })
    let cameraAction = UIAlertAction(title: "Camera", style: .default, handler: { (action: UIAlertAction!) in
        print("I am working")
    })

    alertController.addAction(okAction)
    alertController.addAction(cameraAction)
    presenter.present(alertController, animated: true, completion: nil)
}

Мне действительно нужно узнать контроллер представления, чтобы передать его в функции imageHandler (presenter: UIViewController).

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

В этом случае вы можете получить верхний контроллер с помощью этого расширения

extension UIApplication {

    class func getTopMostViewController() -> UIViewController? {
        let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
        if var topController = keyWindow?.rootViewController {
            while let presentedViewController = topController.presentedViewController {
                topController = presentedViewController
            }
            return topController
        } else {
            return nil
        }
    }
}


@objc func imageHandler() {
        //...
        UIApplication.getTopMostViewController()?.present(alertController, animated: true, completion: nil)

    }
0 голосов
/ 17 июня 2020

Вы можете добавить ссылку weak var на контроллер внутри вашего UIButton. Лучше было бы добавить функцию обработчика в расширение UIViewController и addTarget в viewDidLoad вместо init(frame:) UIButton. Вот пример:

final class ProfileButton: UIButton {
    //Remove addTarget from init(frame:)
}

class ViewController: UIViewController {
    let profileButton = ProfileButton()
    override func viewDidLoad() {
        super.viewDidLoad()
        //...
        profileButton.addTarget(self, action: #selector(imageHandler), for: .touchUpInside)
    }
}

extension UIViewController {

    @objc func imageHandler() {
        let alertController = UIAlertController(title: "Profile Picture", message: "Please select your profile picture", preferredStyle: .alert)
        let okAction = UIAlertAction(title: "Photo Library", style: .default, handler: { (action: UIAlertAction!) in
            print("I am working")
        })
        let cameraAction = UIAlertAction(title: "Camera", style: .default, handler: { (action: UIAlertAction!) in
            print("I am working")
        })

        alertController.addAction(okAction)
        alertController.addAction(cameraAction)
        present(alertController, animated: true, completion: nil)
    }
}
...