Один и тот же UIProgressView для нескольких контроллеров представления

ПРЕАМБУЛА

У меня есть приложение iOS с двухстраничным процессом регистрации.

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

В настоящее время процесс регистрации состоит из шести полей.

Существующий UIProgressView принимает ввод с плавающей запятой, основанный на 1/6 обновлении, когда текстовое поле заканчивает редактирование.

UIProgressView первого контроллера запускается с нулевым плавающим значением.

После заполнения всех полей; второй контроллер представления запускается со значением float 0,5.

ПРОБЛЕМА

Это решение примитивно, и проблем много.

Для начала вы можете увидеть оба UIProgressView во время раскрутки/перехода.

ВОПРОС

Могу ли я использовать один и тот же UIProgressView для двух контроллеров представления?

Спасибо заранее за вашу помощь.

Примечание

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

ГЛАВНОЕ ИЗОБРАЖЕНИЕ ПРОБЛЕМЫ UIProgressView Issue

Решение проблемы, показанной на изображении выше, является моей основной целью.


person arman    schedule 19.01.2015    source источник


Ответы (3)


Если вы хотите, чтобы индикатор выполнения оставался фиксированным, пока пользователь завершает ваши 2 регистрации VC, используйте сдерживание контроллера представления.

Создайте родительский контроллер представления, который содержит представление прогресса и представление контейнера для хранения одного из двух регистрационных VC. Используйте переход для внедрения, чтобы связать представление контейнера с дочерним контроллером представления. Вы можете сделать дочерний контроллер представления контроллером навигации, если хотите, или вы можете просто встроить первый регистрационный VC, а затем выполнить анимацию между первым и вторым по желанию.

Изменить. Существует метод transitionFromViewController:toViewController:duration:options:animations:completion:, который позволяет легко создавать переходы между дочерними контроллерами представления.

Второе редактирование: если вам нужно установить связь между родительским контроллером представления и дочерним(и) контроллером представления, вы должны подключить способ сделать это самостоятельно. Обычный способ связи от дочернего объекта с родительским — настроить свойство делегата в дочернем элементе и определить простой протокол для обратной связи с родительским. В родительском методе prepareForSegue вы устанавливаете свойство делегата дочернего элемента в self. Затем ребенок может отправлять сообщения родителю по мере необходимости.

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

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

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

У меня есть проект на gitHub с поистине ужасным названием "test" (ссылка ), который устанавливает родительский и дочерний контроллер представления, а также связь от родителя к дочернему и от дочернего к родительскому.

person Duncan C    schedule 19.01.2015
comment
Идеальный партнер. Представление контейнера с дочерними контроллерами сделало пользовательский интерфейс бесшовным, и его реализация не заняла много времени. Спасибо за совет. - person arman; 21.01.2015
comment
Любая идея, как я могу управлять контроллером родительского представления UIProgressView из контроллера дочернего представления? - person arman; 21.01.2015
comment
Нет автоматического способа сделать это. См. Мое второе редактирование моего ответа, чтобы узнать, как это сделать. - person Duncan C; 21.01.2015
comment
Ключевым для меня здесь было вложение встроенного контроллера представления в его собственный навигационный контроллер, чтобы он не заменял все представление. Я только хотел, чтобы он заменил содержащееся представление. - person Andrew Kirna; 05.11.2019

На мой взгляд, создайте два отдельных UIProgressView для обоих контроллеров.

Все, что вам нужно сделать, это поиграть с его значением. Здесь важны данные, а не пользовательский интерфейс. Я имею в виду, если вы хотите показать, что половина прогресса была завершена. Этого можно достичь, создав новый элемент управления UIProgressView в следующем контроллере, потому что в конечном итоге данные в элементе управления будут одинаковыми.

Поэтому, когда вы закончите процесс завершения на первом контроллере представления, передайте значения первого элемента управления прогрессом второму контроллеру представления и на основе этого значения создайте второй элемент управления прогрессом.

Если вы не знаете, как передавать данные между двумя контроллерами представления, чем этот answer поможет вам.

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

var appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
appDelegate.window?.addSubview(progressView)
person Kampai    schedule 19.01.2015
comment
Привет, Кампай. Благодарю за ваш ответ. Я того же мнения и согласен с вашим решением. Я скорректировал приведенный выше вопрос, включив в него изображение моей основной проблемы, не позволяющей мне принять указанные решения. Пожалуйста, порекомендуйте. - person arman; 19.01.2015
comment
если вы хотите заполнить белый пробел при пролистывании для навигации, то это невозможно, потому что пролистывание назад — это функция по умолчанию, представленная в iOS7, и мы не можем вводить анимацию между просмотрами. - person Kampai; 19.01.2015
comment
Ok. Спасибо за помощь. Я попытаюсь развернуть два представления в одном контроллере представления. В противном случае я воспользуюсь одним из ваших предложений. - person arman; 19.01.2015

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

Для примера сценария, включающего пятиэтапную адаптацию, мой метод таков:

  • Добавьте индикатор выполнения для каждого VC в потоке.
  • Для первого индикатора выполнения вы можете просто установить прогресс на 0,2 в раскадровке.
  • Во-вторых, в viewDidLoad сначала установите прогресс бара на 0,2 с помощью: yourProgressBar.progress = 0.2
  • Затем чуть ниже: let dispatchTime = DispatchTime.now() + 0.01 DispatchQueue.main.asyncAfter(deadline:dispatchTime, execute: { self.onboardingProgress.setProgress(0.4, animated: true)})
  • Повторяйте с шагом 0,2 для каждого нового шага адаптации.

Dispatch Queue позволяет индикатору выполнения установить предыдущий прогресс VC, а затем анимировать его до нового прогресса. Без DispatchQueue вся полоса прогресса анимировалась бы с самого начала при загрузке VC, полностью разрушая желаемый эффект.

Я надеюсь, что это может помочь кому-то!

person MichaelMartin    schedule 11.01.2021