Увольнение iPad UipoPovovontroller, когда Barbuttonitem выталкивается, пока он открыт
-
27-09-2019 - |
Вопрос
Используя разделенный вид на iPad, у меня есть следующий код:
- (void) splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc {
barButtonItem.title = @"Categories";
NSMutableArray *items = [[toolbar items] mutableCopy];
[items insertObject:barButtonItem atIndex:0];
[toolbar setItems:items animated:YES];
[items release];
self.popoverController = pc;
}
Это хорошо работает, чтобы показать запас, когда кнопка нажата. Тем не менее, я также хотел бы уволить запасы, если кнопка нажата, пока она уже открыта, чтобы следовать хорошим рекомендациям. Как бы я пошел по этому поводу? (т.е. если пользователь неоднократно нажимает эту кнопку, топоверку должно прийти и скрывать каждый другой удар.)
Решение
Когда SplitViewController дисплей POPOVER, ниже будет вызываться метод. Просто проверь, если не ноль, то уволяй это :)
- (void)splitViewController:(UISplitViewController*)svc popoverController:(UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController{
if ([pc isPopoverVisible]) {
[pc dismissPopoverAnimated:YES];
}
}
Другие советы
HIG Apple говорит, что не должно быть явной кнопкой увольнения внутри капотора, но делать то, что вы спрашиваете, у вас есть два варианта.
1) опубликовать nsnotification
ИЛИ
2) Унимись к иерархии вашей просмотры, пока у вас не будет экземпляра популяции
1) В зависимости от того, в каком представлении вы представляете Поповертую, в методе ViewDiDload:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissThePopover) name:@"popoverShouldDismiss" object:nil];
Создать метод под названием «SworkSthePopover» и в методе Dealoc, RemoveObserver
-(void)dismissThePopover {
[self.popoverController dismissPopoverAnimated:YES];
}
-(void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
В вашем Popovovontroller кнопку «Уволить» введите эту строку:
[[NSNotificationCenter defaultCenter] postNotificationName:@"popoverShouldDismiss" object:nil];
Это отправляет уведомление в приложение, и поскольку вы зарегистрировали свой другой контроллер просмотра, чтобы прослушать его, всякий раз, когда он видит, что это уведомление о том, что он называет селектор, который вы указываете, в данном случае, отключившись.
2) Унимись к своей иерархии вашей просмотры, чтобы найти Self.poPoverController
Проверьте это, ваш будет отличаться, конечно, но общая идея одинакова. Начните с вашего AppDelegate, перейдите в первый ViewController, переместитесь в сообщения, пока не дойдете до своего объекта Self.poverController.
MyAppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
//appDelegate instance, in this case it's the .m file for your ApplicationDelegate
UISplitViewController *svc = appDelegate.splitViewController;
//In this case the first view inside the appDelegate is a SplitView, svc
UINavigationController *navc = [[svc viewControllers]objectAtIndex:0];
//a navigationController is at index:0 in the SplitView hierarchy. DetailView is at index:1
NSArray *vcs = [navc viewControllers];
//vcs is the array of different viewcontrollers inside the Navigation stack for nvc
iPadRootViewController *rootView = [vcs objectAtIndex:0];
//declare the rootView, which is the .m file that is at index:0 of the view array
UIPopoverController *pc = [rootView popoverController];
//HERE WE GO!!! popoverController is a property of iPadRootViewController's instance rootView, hereby referred to as pc.
[pc dismissPopoverAnimated:YES];
//bye bye, popoverController!
Надеюсь это поможет
Это намного проще, потому что PopovoverController - это недвижимость. Облегчает ссылку.
if ([self.popoverController isPopoverVisible]) {
//using the setters and getters "goes thru the proper channels" when accessing objects
[self.popoverController dismissPopoverAnimated:YES];
} else {
UIPopoverController *pc = [[UIPopoverController alloc] initWithContentViewController:YOUR_VIEW_CONTROLLER];
self.popoverController = pc;
[pc release];
//get the button instance you set on the toolbar
UIBarButtonItem *categoryButton = [[toolbar items] objectAtIndex:0];
[self.popoverController presentPopoverFromBarButtonItem:categoryButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
Я действительно понял, что вы относитесь к коду внутри метода делегата для отображения ViewController при индексе: 0 вашего SplitView. Этот ответ не обязательно применяется к этому, но применимо к любому другому времени, которое вы получаете и создавая PopoverControllers на iPad. Не проверяя, если попуктор будет отображаться сначала, вы будете либо сбиться, либо открыть несколько замков.
Спасибо за ваше время.
Вы можете попробовать ниже
if(![popoverController isPopoverVisible]){
// Show popover
}
else{
// close popover
[popoverController dismissPopoverAnimated:YES];
}
Если вы используете по умолчанию UISplitViewController
Настройка, затем кнопка навигации, которая создана, которая создана, отображает попуклад вашего RootViewController
.
Если вы хотите убедиться, что у вас нет нескольких всплывающих окон, вы можете просто отклонить всплывающие окна всякий раз, когда ваш RootViewController
будет появляться. Вот код, который я использовал для решения этой проблемы:
- (void) viewWillAppear:(BOOL)animated {
if ([self.popover isPopOverVisible]) {
[self.popover dismissPopoverAnimated:YES];
}
[super viewWillAppear:YES];
}
Код, который я использовал для отображения popover в rootviewcontroller.m:
- (IBAction) addCategory:(id)sender {
AddCategoryViewController *content = [[AddCategoryViewController alloc] init];
UIPopoverController *aPopover = [[UIPopoverController alloc]
initWithContentViewController:content];
aPopover.delegate = self;
// Store the popover in a custom property for later use.
self.addCategoryPopover = aPopover;
addCategoryPopover.delegate = self;
[aPopover release];
[content release];
[addCategoryPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}
Это я пытался уволить его из другого класса:
-(IBAction)saveAddCategory:(id)sender {
rootViewController = [[RootViewController alloc] init];
[rootViewController dismissPopover];
}
Мой dismissPopover
Функция выглядит как:
- (void) dismissPopover {
if ([self.addCategoryPopover isPopoverVisible]) {
[self.addCategoryPopover dismissPopoverAnimated:YES];
}
if (addCategoryPopover.popoverVisible == YES) {
[addCategoryPopover dismissPopoverAnimated:YES];
}
}
Да, вы можете установить modalPresentationStyle
как следующее:
controller.modalPresentationStyle = UIModalPresentationFormSheet;