2012-05-09 2 views
1

Мне часто нужен специальный модальный диалог, который не заполняет весь экран, например лист действий, который поставляется с SDK iOS. Это диалоговое окно должно обрабатывать некоторые сложные сценарии и условия, например, вращение интерфейса, а также часто содержит много кода для обработки пользовательских вариантов. Поэтому представляется весьма желательным построить диалог как комбинацию обычного вида + контроллера и заставить его работать как первоклассный гражданин в пользовательском интерфейсе.Как создать пользовательские модальные диалоги в качестве обычных контроллеров?

В этом отношении системный интерфейсный контроллер API (presentModalViewController:animated:) весьма ограничен, например, он настаивает на том, чтобы спрятать контроллер под модальным и заставить вас использовать предопределенные анимации с небольшим контролем над ними.

API-интерфейс сдерживания контроллера выглядит довольно многообещающим, так как он позволяет одновременно просматривать несколько видов на экране, каждый из которых управляется другим контроллером. (Это как раз ситуация с модальным диалогом на регуляторе регулярного представления.) Но взаимодействие со стандартными контейнерными контроллерами (например, UINavigationController) является скалистым, as I have found out.

Есть ли у кого-нибудь техническая работа, которая позволила бы поддерживать не-полноэкранные модальные диалоги в качестве обычных контроллеров вида и заставить их хорошо играть с остальной частью пользовательского интерфейса?

ответ

0

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

Я создаю контроллер, который подклассифицирует NSObject и добавит его как объект в interfacebuilder. Затем я устанавливаю контроллер как для контейнера, так и для contentView. Я создаю метод инициализации, который принимает containerView как параметр и выполняет то, что я обычно делал бы в viewWillAppear в этом методе. Метод инициализации, который я вызываю из контроллера представления, который отвечает за передачу контейнера в модульный контроллер.

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

Вот метод, который я вызываю из своего главного контроллера в iPad. Реферат из нерелевантного материала :)

- (IBAction)showAddProduct:(UIButton *)sender { 
    UIView *containterForAddProduct = self.darken; 
    containterForAddProduct.alpha = 0; 
    [self.view addSubview:containterForAddProduct]; 
    [self.addEditProductController beginAddingProductInContainerView:containterForAddProduct andManagedObjectContext:self.gridController.managedObjectContext]; 
} 
+0

Недостатком является то, что такой контроллер не является частью иерархии контроллера и, следовательно, не принимает вызовы вращения и внешнего вида? Именно этого я и стараюсь избегать, я бы хотел, чтобы модальный диалог был регулярной частью пользовательского интерфейса, так же, как это было бы при представлении с помощью 'presentModalViewController: animated:'. – zoul

+0

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

+0

Вот и все, что я хочу, чтобы иметь возможность полностью обмениваться контентом и вообще делать какие-то сумасшедшие вещи, которые вы можете делать в обычном контроллере. Ручная ретрансляция всей информации и обратных вызовов из родительского контроллера представления отстой - вот почему я пытаюсь найти какое-то «системное» решение. API сдерживания * очень * близко, если бы не проблемы с 'UINavigationController'. – zoul

Смежные вопросы