Разве плохо использовать функции stati c для обработки всплывающих окон в Swift? - PullRequest
1 голос
/ 29 января 2020

У меня есть много контроллеров представления, которые используют те же две функции, которые показывают и скрывают всплывающее окно для меня. Каждый раз, когда я их использую, я спрашиваю себя, не лучше ли поместить их в глобальный класс, например, PopupUtils, и установить функции как stati c functions.

Я сделал это, и это сработало, но Я не уверен, что это хорошая вещь, потому что я должен передать своей функции три аргумента: родительский контроллер представления, дочерний контроллер представления и представление popup_container

Так как все это передается val, там не проблема с памятью? или любая другая проблема, о которой я должен знать?

Вот мой класс stati c, называемый Popup Utils

class PopupUtils {

 static func showPopupView(parentViewController: UIViewController, childViewController: UIViewController, popupContainer: UIView) {


        parentViewController.addChild(childViewController)

        popupContainer.addSubview(childViewController.view)

        childViewController.view.frame = popupContainer.bounds
        childViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

        childViewController.didMove(toParent: parentViewController)

        UIView.transition(with: popupContainer, duration: 0.2, options: .transitionCrossDissolve, animations: {
            popupContainer.isHidden = false
        })

    }


    static func removePopupView(childViewController: UIViewController, popupContainer: UIView){

        // Remove pop up VC from children
        childViewController.willMove(toParent: nil)
        childViewController.view.removeFromSuperview()
        childViewController.removeFromParent()

        // Hide pop up container
        popupContainer.isHidden = true

        // Release language menu
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "releaseMenuSwipe"), object: nil)

    }
}

Ответы [ 2 ]

2 голосов
/ 29 января 2020

Это не так уж плохо, но как насчет расширения UIViewController

extension UIViewController {

    func showPopupView(childViewController: UIViewController, popupContainer: UIView) {
        addChild(childViewController)
        popupContainer.addSubview(childViewController.view)
        childViewController.view.frame = popupContainer.bounds
        childViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        childViewController.didMove(toParent: self)

        UIView.transition(with: popupContainer, duration: 0.2, options: .transitionCrossDissolve, animations: {
            popupContainer.isHidden = false
        })
    }

    func removePopupView(childViewController: UIViewController, popupContainer: UIView) {

        // Remove pop up VC from children
        childViewController.willMove(toParent: nil)
        childViewController.view.removeFromSuperview()
        childViewController.removeFromParent()

        // Hide pop up container
        popupContainer.isHidden = true

        // Release language menu
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "releaseMenuSwipe"), object: nil)

    }
}

Альтернативой избавления от параметров является расширение протокола. Предполагается, что принимающий UIViewController имеет два свойства popupContainer и childViewController, если они являются необязательными изменениями и соответственно обрабатывают тип.

Два метода в расширении доступны для любого UIViewController, который принимает протокол

protocol PopupManageable {
    var popupContainer: UIView { get }
    var childViewController: UIViewController { get }
}

extension PopupManageable where Self : UIViewController {

    func showPopupView() {
        self.addChild(childViewController)
        popupContainer.addSubview(childViewController.view)
        childViewController.view.frame = popupContainer.bounds
        childViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        childViewController.didMove(toParent: self)

        UIView.transition(with: popupContainer, duration: 0.2, options: .transitionCrossDissolve, animations: {
            self.popupContainer.isHidden = false
        })
    }

    func removePopupView() {

        // Remove pop up VC from children
        childViewController.willMove(toParent: nil)
        childViewController.view.removeFromSuperview()
        childViewController.removeFromParent()

        // Hide pop up container
        popupContainer.isHidden = true

        // Release language menu
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "releaseMenuSwipe"), object: nil)

    }
}
0 голосов
/ 29 января 2020

Я думаю, вы должны следить за всем. Вы передаете контроллер представления и добавляете дочерний контроллер представления. Это может привести к утечке памяти, если вы не будете знать о сложности в будущем. Отслеживайте распределение при каждом добавлении новой задачи. в нем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...