Представьте контроллер модального представления с прозрачным фоном

Я хочу представить UIViewController программно, который должен отображаться (или, скорее, не отображаться) с прозрачным фоном. Я хочу это для iOS 7.0 и выше. У меня появилось много вопросов (и ответов), но они не смогли мне помочь. Вот иерархия представлений моего приложения.

Я использую контроллер бокового меню (RESideMenu).

У меня есть rootView (база из RESideMenu) -> Отображение контроллера Center (вместе с контроллером левого представления) в UINavigationController.

В требованиях я хотел бы представить контроллер представления

Из нажатого контроллера представления (в навигационной иерархии)

Из представленного контроллера представления (в навигационной иерархии)

Кроме того, мне нужно представить его и выполнить какое-то действие, а затем удалить его.

Я почти уверен, что это должно работать во многих случаях, с (или без) боковым меню или даже с навигационным контроллером.

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


person Hemang    schedule 22.12.2014    source источник


Ответы (1)


Предположим, мы находимся в FirstViewController

//Obj-C
- (void) presentSecondVC {
    SecondViewController *vc = [[SecondViewController alloc] init];
    [self addChildViewController:vc];
    [self didMoveToParentViewController:vc];
}

//Swift
func presentSecondVC() {
    let vc = SecondViewController.init()
    self.addChildViewController(vc)
    self.didMove(toParentViewController: vc)
}

Некоторым из вас может понадобиться написать описанный выше метод следующим образом:

//Obj-C
- (void) presentSecondVC {
    SecondViewController *vc = [[SecondViewController alloc] init];
    vc.view.frame = CGRectMake(0,0,width,height); //Your own CGRect
    [self.view addSubview:vc.view]; //If you don't want to show inside a specific view
    [self addChildViewController:vc];
    [self didMoveToParentViewController:vc];
    //for someone, may need to do this.
    //[self.navigationController addChildViewController:vc];
    //[self.navigationController didMoveToParentViewController:vc];   
}

//Swift
func presentSecondVC() {
    let vc = SecondViewController.init()
    vc.view.frame = CGRect.init(x: 0, y: 0, width: width, height: height) //Your own CGRect
    self.view.addSubview(vc.view) //If you don't want to show inside a specific view.
    self.addChildViewController(vc)
    self.didMove(toParentViewController: vc)
    //for someone, may need to do this.
    //self.navigationController?.addChildViewController(vc)
    //self.navigationController?.didMove(toParentViewController: vc)
}

Теперь в SecondViewController, когда вы хотите вернуться

//Obj-C
- (void) goBack {
    [self removeFromParentViewController];
}

//Swift
func goBack() {
    self.removeFromParentViewController()
}

Играйте хорошо (с каждым сценарием) :)

И да, это не будет показывать анимацию, в моем случае я показываю пользовательское всплывающее окно внутри vc, хотя с этим кодом это выглядит красиво!

person Hemang    schedule 22.12.2014
comment
Чтобы, Уважаемые пользователи Downvoters, постарайтесь оставить здесь свой след с комментарием о причине вашего отрицательного голосования. Было бы очень полезно узнать что-то и улучшить себя. Я держу свой ответ здесь (как и в моем вопросе), чтобы помочь вам (и, возможно, другим разработчикам). Однако, если это выглядит плохо или не сработало для вас, не стесняйтесь написать свое слово (и, если возможно, и свое решение) вместе с вашим несогласным голосованием против. Обязательно оценю, спасибо! :) - person Hemang; 22.12.2014
comment
Метод goBack неполный, следует вызвать removeFromSuperView. UIViewController Class Reference для вас. - person DawnSong; 12.12.2015
comment
Вам нужно добавить [self.view addSubview:vc.view]; эта строчка в обоих случаях.... только addChildViewController ничего не сделает... - person Mihir Mehta; 21.06.2016
comment
Основная причина отрицательных голосов - ваш ответ о том, как добавить дочерний контроллер представления, а не о том, как представить контроллер представления, между ними есть большая разница. разработчик. apple.com/library/content/featuredarticles/ для всех, кто заинтересован, читайте документы Apple - person Iraniya Naynesh; 26.03.2018
comment
@IraniyaNaynesh, спасибо, что заглянули, я задал этот вопрос и ответил на него несколько лет назад. Пожалуйста, не стесняйтесь редактировать детали вопроса или мой ответ, чтобы получить идеальную картинку. И да, АТБ для Дувери! :) П.С. Я больше не против минусовщиков. - person Hemang; 26.03.2018