MonoTouch для iPad: Как отобразить всплывающее диалоговое окно?

#ipad #xamarin.ios #uialertview #uiactionsheet

#iPad #xamarin.ios #uialertview #uiactionsheet

Вопрос:

Я только начал изучать разработку приложения (в первую очередь) для iPad с использованием MonoTouch. Возможно, из-за моего многолетнего опыта работы в мире C # это очень затрудняет мой переход, и иногда я чувствую себя глупо. Это очень простая вещь в C #, но она заставляет меня почесать затылок…

Всплывающее диалоговое окно?

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

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

Из того, что я узнал, мне нужно использовать UIAlertView или UIActionSheet для этого. Но чего я не понимаю, так это того, что, как показывают все примеры, которые я прочитал, вы должны создать все элементы управления из кода.

Что я хотел бы сделать, так это создать пользовательский интерфейс с помощью IB и подключить его к UIActionSheet. Возможно ли это? Как мне это сделать?

Ответ №1:

Если это приложение только для iPad, вы захотите использовать UIPopoverController. Это всплывающее «окно», которое содержит представление и связано с областью на экране, такой как кнопка панели инструментов или прямоугольник (например, рамка UIButton).

Чтобы использовать это, создайте новый экземпляр UIPopoverController, используя конструктор, который принимает UIViewController и передает представление, которое вы хотите показать.

Из-за соображений сборки мусора убедитесь, что вы храните UIPopoverController в свойстве уровня класса.

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

Как только вы создадите экземпляр всплывающего окна, вам захочется его показать. Вы можете сделать это с помощью одного из методов PresentFromxxx. Если вы представляете это с помощью кнопки (не панели инструментов), вы можете вызвать PresentFromRect, используя рамку кнопки в качестве прямоугольника.

Представленное представление может управлять своим размером, задав свойство ContentSizeForViewInPopover в его методе viewDidLoad.

Комментарии:

1. Большое вам спасибо. Это именно то, что я ищу.

2. По некоторым причинам я не запускаю событие увольнения. Нужно ли мне что-нибудь сделать, чтобы это событие произошло? Или мне нужно подкласс UIPopoverController переопределить метод Dismiss?

3. Если вы закрываете диалоговое окно программно, событие увольнения не запускается (я нашел это где-то в документации Apple). Вот почему мы в конечном итоге разделили контроллер на подклассы и переопределили метод Dismiss .

4. Хорошие новости! Я создал реализацию всплывающего окна для MonoTouch, которая работает как на iPad, так и на iPhone, а также позволяет настраивать внешний вид. Вы можете проверить это @: github.com/anujb/Devnos . Поповер

5. Спасибо за вашу поддержку, я попробую это сделать.

Ответ №2:

Вы не можете редактировать UIActionSheet или UIAlertView из Interface Builder.

Что вы можете сделать, так это создать представление в Interface Builder и отобразить его модально поверх других ваших представлений, однако, похоже, вы не хотите занимать весь экран, и это то, что произойдет. Вот пример контроллера модального представления: http://pastebin.com/h221BQdK

Я думаю, вам следует просто следовать приведенным вами примерам и создать UIAlertView из кода, возможно, поместить его в статический служебный класс. Я создал класс MessageBox, чтобы он был больше похож на Windows, но вы также можете поместить туда текстовые поля для входа в систему. Посмотрите на окно входа в app Store, это достойный пример того, как это будет выглядеть.

Комментарии:

1. большое спасибо за ваш совет. Хотя это не совсем ответ на мой вопрос, но это определенно полезно.

Ответ №3:

Создайте viewcontroller с именем extraviewcontroller, установите его ширину по высоте 300 * 215 . и напишите код ниже

inviewdidload

 pickerviewTitle = [[UIPickerView alloc] initWithFrame:CGRectMake(0,0, 383, 250)];
pickerviewTitle.delegate = self;
pickerviewTitle.tag = 0;
pickerviewTitle.showsSelectionIndicator = YES;

controller = [self.storyboard instantiateViewControllerWithIdentifier:@"ExtraViewController"];
popovercontroller = [[UIPopoverController alloc] initWithContentViewController:controller];
popovercontroller.delegate = self;
 

затем

 UIActionSheet *actionSheet1 = [[UIActionSheet alloc] initWithTitle:@"Title" delegate:self cancelButtonTitle:@"Done" destructiveButtonTitle:nil otherButtonTitles:nil];
actionSheet1.tag = 0;
actionSheet1.actionSheetStyle = UIActionSheetStyleDefau<
[actionSheet1 addSubview:pickerviewTitle];
[actionSheet1 setFrame:CGRectMake(0, 0, 600, 400)];

[controller.view addSubview:actionSheet1];


if ([popovercontroller isPopoverVisible]) {
    [popovercontroller dismissPopoverAnimated:YES];
} else {

    //the rectangle here is the frame of the object that presents the popover,
    //in this case, the UIButton…

    CGRect convertedFrame = yourclickbutton.frame;


    [popovercontroller presentPopoverFromRect:convertedFrame
                                       inView:self.view
                     permittedArrowDirections:UIPopoverArrowDirectionRight
                                     animated:YES];

}