Как мне универсально ссылаться на self.view? - PullRequest
0 голосов
/ 03 октября 2019

У меня есть многократно используемый компонент alertController, на который ссылаются для создания alertController во всем приложении. Я пытаюсь добавить эффект размытия, но не могу сослаться на представление, над которым всегда находится alertController.

let blurEffect = UIBlurEffect(style: .light)
let blurVisualEffectView = UIVisualEffectView(effect: blurEffect)

blurVisualEffectView.frame = self.view.bounds

let vc = UIAlertController(title: title, message: message, preferredStyle: .alert)

let alertActions = (actions.map { a in UIAlertAction(title: a.display, style: .default, handler: { _ in then() ; a.handler?() }) })

for action in alertActions {
    vc.addAction(action)
    blurVisualEffectView.removeFromSuperview()
}

if actions.isEmpty {
    let action = UIAlertAction(title: "Something went wrong", style: .default) { _ in then() }
    vc.addAction(action)
}

self.view.addSubview(blurVisualEffectView)

Я получаю ошибку

Использование неразрешенного идентификатора 'self'

Ответы [ 3 ]

1 голос
/ 03 октября 2019

Вам нужно

extension UIViewController {

    func showBluredAlert(_ actions:[Model]) {
        let blurEffect = UIBlurEffect(style: .light)
        let blurVisualEffectView = UIVisualEffectView(effect: blurEffect)
        blurVisualEffectView.frame = self.view.bounds 
        self.view.addSubview(blurVisualEffectView)

        // add the alert here

    }
}

Затем вызовите его внутри любого экземпляра vc с помощью

showBluredAlert(<#[Model]#>)

Также не забудьте эту строку

self.present(vc, animated: true, completion: nil)
0 голосов
/ 03 октября 2019

Каждый контроллер представления имеет ссылку на его parent . Если вы хотите, чтобы представление родительского viewController его parent?.view. Кроме того, каждый модал может получить свой presentingViewController . Я бы просто добавил размытие к представлению контроллера предупреждений, так как это, как правило, плохо для работы с внутренностями другого объекта, который вам не принадлежит:

vc.view.addSubview(blurVisualEffectView)
0 голосов
/ 03 октября 2019

Что бы я сделал, это использовал Notification. Notification s позволяют различным частям вашего приложения общаться друг с другом. Во-первых, добавьте наблюдателя в любой класс, в котором создан ваш контроллер предупреждений:

class myClass: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(showAlertController), name: "ShowAlertController", object: nil)
    }

    @objc func showAlertController() {
        //Within this function, add the code that will show the alert controller
    }
}

Теперь, с любого другого контроллера представления в вашем приложении, вы можете публиковать сообщения в Notification с именем «ShowAlertController», и это *Будет вызван метод 1007 *:

class someViewController {

    //Pressing this button should make the alert controller appear
    @IBAction buttonPressed(_ sender: Any) {
        NotificationCenter.default.post(name: "ShowAlertController", object: nil)
    }
}

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

В идеале вы хотели бы сделать расширение до UIViewController, как предложил Sh_Khan, но если вам нужнов одном классе ссылочные методы из другого класса Notification s являются одним из решений.

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