Каков правильный способ просмотра наложения всех других viewControllers в приложении?

Я относительно новичок в разработке iOS, и планирую приложение. Приложение будет иметь несколько разных сцен / ViewControllers, которые будут охватывать весь экран.

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

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

Мой инстинкт после прочтения руководства по программированию View Controllers – создать контейнер View Controller, который будет корневым vc – этот vc будет иметь два дочерних vcs – один с домашней кнопкой, а другой под тем, в который входят все остальные VC ( эффективно становясь новым корнем vc.)

Это похоже на разумное решение для более опытных разработчиков iOS? Есть ли более простое решение?

Любые советы с благодарностью получили.

Я думаю, это, скорее всего, ваше лучшее решение. В iOS ViewController занимает все пространство, доступное для его просмотра. Без представления «контейнера», которое вы управляете самим собой, любой контроллер вида, который вы устанавливаете, будет занимать все окно, покрывая все, что вы отображали.

Однако есть альтернативный подход, который может быть проще, в зависимости от вашего проекта.

Вы можете создать объект UIView (ваша кнопка) в некотором центральном месте (скажем, ваш класс делегата App). В этом представлении может быть кнопка, которую вы присоединяете к методу:

@implementation AppDelegate - (void) someSetupMethod { UIButton* b = [UIButton buttonWithType:UIButtonTypeCustom]; // setup whatever properties // Now set button to call a method *on this AppDelegate object* ("self"): [b addTarget:self action:@selector(homeButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; // Store the button definition somewhere permanant self.reusableHomeButton = b; } - (void) homeButtonTapped:(id)sender { // do something to pop view controllers back to what you want. } 

Затем, по вашему мнению, контроллеры, они могут показать кнопку дома, когда они появятся:

 - (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate; [self.view addSubview:appDelegate.reusableHomeButton]; } 

Это использует преднамеренный побочный эффект [view addSubview:...] который заключается в том, что если представление уже находится в некотором родителе, оно сначала удаляет его из этого родителя , а затем добавляет к новому представлению.

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

Это приводит к тому, что ваша кнопка будет «перемещаться» от одного отображаемого вида контроллера просмотра до нового, когда будет представлен новый контроллер.

Так как кнопка имеет цель объекта AppDelegate (и поэтому отправляет ее сообщение этому объекту), она работает «из любого места», если существует объект делегирования приложения для получения сообщения (которое он делает до тех пор, пока ваше приложение бежит).

С помощью Swift вы можете использовать возможности протоколов и расширений протоколов. Я написал статью об этом подходе. Короче вам понадобится следующее:

  1. Создайте протокол, описывающий контроллер наложения.
  2. Инкапсулируйте логику представления / отклонения контроллера представления в этот протокол с использованием расширения протокола.
  3. Создайте протокол для оверлейного хоста.
  4. Инкапсулируйте логику создания экземпляра контроллера просмотра наложения из раскадровки в этот протокол с использованием расширения протокола.

И все готово. Использование будет выглядеть так:

 class ViewController: UIViewController, OverlayHost { @IBAction func showOverlayButtonPressed() { showOverlay(type: YourOverlayViewController.self, fromStoryboardWithName: "Main") } } 

Исходный код: https://github.com/agordeev/OverlayViewController

  • Разница между контроллером навигации и диспетчером просмотра?
  • Загрузите UIViewController из отдельного файла nib в swift?
  • Неверный 'presentingViewController'
  • Можно ли создать UIViewController в фоновом потоке?
  • viewWillDisappear и viewDidDisappear никогда не вызываются
  • как я могу сделать uiviewcontroller видимым только один раз во время первого запуска приложения (например, учебник)?
  • Архитектура архитектуры iPhone Core - как использовать ее через несколько контроллеров
  • Что будет, если я вызову одновременно получить @ "foo.xml" delegate: self] в двух UIViewControllers?
  • Предупреждение. Попытайтесь представить, чей вид не находится в иерархии окон! При использовании идентифицированного segue
  • Загрузить представление из файла NIB из нескольких разных UIViewControllers
  • Сохраняйте элементы пользовательского интерфейса при переходе между UIViewControllers
  • Interesting Posts

    Каков правильный способ добавления настраиваемых переменных для извлечения таких классов, как UIButton?

    Асинхронная загрузка изображений для UITableView с GCD

    CBPeripheralManager Задержки stopРеклама / Диспетчер местоположения остановлены iBeacon

    Xcode 6.1: Множество методов с именем «count» найдено с несогласованным результатом, типом параметра или атрибутами

    Можете ли вы контролировать порядок проходов при добавлении его в Apple Wallet?

    Не удалось избавиться от «Заставка iPhone Retina (4 дюйма) для iOS 7.0 и более поздних версий».

    Всегда видеть Зеркальное изображение при захвате с передней камеры iOS 5.0

    Просмотр Peek & pop на MKMapView

    Cocoapods <RestKit / RestKit.h> не найден

    UITableView и другой вид внутри ScrollView

    Как сделать UILabel в Swift кругом

    Положение обнаружения личности iOS

    Заполнение UITableView с помощью NSDictionary JSON в Swift

    Что такое приложение iOS для приложения Cache.db в пути к кэшированию библиотеки?

    В чем разница между распределением ad hoc и дистрибутивом магазина приложений в ios

    Давайте будем гением компьютера.