Как сделать view видимым на любом VC в стеке!?


#21

Да, с этим у меня проблемы)) Извиняюсь)
Но я думал централизовано все делать!
Т.е. например на уровне application существует errorSubject, в который идут все сетевые ошибки, и чтобы не биндить его к каждому VC все делать через window, но встает вопрос с определением, где я сейчас нахожусь!!!
Я может что-то не понимаю и из-за этого не могу решить задачу!)


#22

Посмотри как с лоадером сделано. LoaderView - это просто вьюха, в которой есть постоянно вращающийся спиннер. Там логики ноль.


extension UIView {
	
	func showProccessing() {
		DispatchQueue.main.async {
			if let window = UIApplication.shared.keyWindow {
				window.addSubview(LoaderView(frame: window.frame))
			}
		}
	}
	
	func hideProccessing() {
		DispatchQueue.main.async {
			if let window = UIApplication.shared.keyWindow {
				window.subviews.forEach { view in
					if view is LoaderView { view.removeFromSuperview() }
				}
			}
		}
	}
}

Ну и использование простое:

class ViewController... {
   

   func foo() {
       view. showProccessing()
       //загрузили данные
       view.hideProccessing()
    }
}

#23

Да) Я делал также) Ток с xibom
У тебя высвечивается на модальных VC?!
В общем если решу, то отпишу, пока не особо работает, может так и нельзя сделать, либо нужно отслеживать на каком VC нахожусь и отправлять указатель на него, но эт прям сложно!!!

Спасибо за Советы!)


#24

Попробуй тест сделать: в модальном контроллере в методе viewDidAppear() запусти метод (ну хоть мой кусок кода добавь). Только вью свою подставь или пустышку с белым фоном. А через пару секунд вызови метод hide…
И посмотри появится или нет.
Она обязана появится.


#25

Ахахахахахахахаххахах!!!

Вот что такое недопонимание!!!

СПАСИБО!!!

Сделал вечный обсервабл и да, все работает!!!

В общем, я делал через window.rootViewController.view

Блин, почему сразу не нашел, что в UIWindow есть addSubview!!!
А сейчас смотрю документациию

Inherits From

UIView

Еще раз спасибО!

Observable<Int>.interval(1, scheduler: MainScheduler.instance)
                .subscribe(onNext: { _ in
                    if let window = UIApplication.shared.keyWindow {
                        let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
                        view.backgroundColor = UIColor.red
                        window.addSubview(view)
                    }
                })

#26

Это ты rxSwift-ом там по ios решил ударить? :wink:
я бы замерял производительность. Надо ли так изголяться? Хотя rx умный. не должен сильно нагружать.


#27

Да)
Я прям тащусь от него, пока производительность на второй план)
Так сказать получаем опыт!)


#28

Ну, потом расскажи, как там с дебагом дела обстоят. Знакомые сеньоры-помидоры до ночи сидят чтоб понять откуда баг и как выпилить. :slight_smile: Поэтому в текущей конторе хоть некоторые и балдеют от RX, остальные плюются и обходятся без него. :slight_smile:


#29

Что-то вы тут нагородили. Как из пушки по воробьям.

class BaseViewController: UIViewController {
    ...

    var myModalView: UIVIew?

    private func initModalView() {
        //создаете свое любое view
        //встраиваете его в view.addSubVIew()
    }

    func showModaView(visible: Bool) {
        //показываете либо прячете его
        //предварительно проверив, что myModalView != nil
        //можно с анимацией
    }
}

class ViewController1: BaseViewController {
    ...

    func someAction() {
        if someError != nil {
            showModalView(visible: true)
            //по вкусу можно добавить и передачу данных.
        }
    }
}

Никаких обсерверов, ничего лишнего.

P.S. если же вам нужно привязать ваше view к конкретному view или позиции, это все так же можно делать в initModalView с переданными параметрами. Тут уже можно делать как душе угодно.