Я создаю статическую библиотеку iOS, которая будет использоваться другими разработчиками. Эта библиотека должна предоставлять собственный модальный интерфейс. Я ищу самый простой способ разработки интерфейса между приложением и этой библиотекой для достижения этой цели. Мне нужно только поддерживать iOS 4.0 и выше.
Грубая архитектура
Моя статическая библиотека имеет очень простой API с одним классом. AppDelegate приложения создает экземпляр этого одного класса и устанавливает себя в качестве делегата, чтобы оно могло получать уведомления. Когда приложение хочет, чтобы библиотека показывала свой пользовательский интерфейс, оно вызывает один метод, а затем, когда библиотека завершает свою работу, оно отправляет уведомление через один из методов протокола делегата.
Я вижу два способа сделать это.
Вариант 1
Когда приложение хочет, чтобы библиотека показывала свой пользовательский интерфейс, AppDelegate передает self.window, и библиотека устанавливает собственный контроллер корневого представления, фактически получая полное владение пользовательским интерфейсом. Когда пользовательский интерфейс завершен, он уведомляет AppDelegate, который затем устанавливает собственный корневой контроллер представления в окне, возвращая право владения пользовательским интерфейсом.
Вариант 2
Библиотека предоставляет контроллер представления, который приложение может поместить в любой стек представлений, который ему нравится. Приложение также отвечает за удаление контроллера представления, когда библиотека уведомляет его о завершении пользовательского интерфейса.
Вопросы
При использовании опции 1 могут возникнуть проблемы при смене контроллеров корневых представлений во время работы приложения. При выборе варианта 2 могут возникнуть проблемы с предоставлением контроллера представления, который может работать в произвольном контексте (в качестве контроллера полноэкранного представления, в качестве дополнительного представления UINavigationController и т. Д.).
Другая проблема с обоими вариантами - это другие уведомления UIApplicationDelegate, которые может получать AppDelegate, например applicationWillResignActive: и applicationDidBecomeActive :. Библиотеке может потребоваться обрабатывать подобные уведомления, чтобы должным образом поддерживать свой пользовательский интерфейс. Должен ли AppDelegate передавать каждый из них в библиотеку, когда его пользовательский интерфейс активен?
Есть ли лучший вариант 3, о котором я не подумал?