Pergunta

Usando uma exibição dividida no iPad, tenho o seguinte código:

- (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;
}

Isso funciona bem para mostrar o popover quando o botão é pressionado. No entanto, eu também gostaria de rejeitar a popover se o botão for pressionado enquanto ele já estiver aberto para seguir boas diretrizes. Como eu iria fazer isso? (ou seja, se o usuário clicar repetidamente neste botão, o popover deve vir e esconder todos os outros acertos.)

Foi útil?

Solução

Quando o SplitViewController Display Popover, o método abaixo será chamado. Basta verificar se não nulo, então descartá -lo :)

- (void)splitViewController:(UISplitViewController*)svc popoverController:(UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController{
  if ([pc isPopoverVisible]) {
     [pc dismissPopoverAnimated:YES];
  }
}

Outras dicas

O HIG da Apple diz que não deve haver um botão de descarga explícito dentro de uma popover, mas, para fazer o que você está pedindo, você tem duas opções.

1) Publicar uma nsnotificação

OU

2) Faça uma hierarquia de visualização até que você tenha a instância do popover

1) Em qualquer visão em que você esteja apresentando o popover, no método ViewDidload:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissThePopover) name:@"popoverShouldDismiss" object:nil];

Crie um método chamado "DismSthePopover" e, no método Dealloc, RemoneBServer

-(void)dismissThePopover {
    [self.popoverController dismissPopoverAnimated:YES];
}

-(void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

No seu botão PopOverController "Dispense", insira esta linha:

[[NSNotificationCenter defaultCenter] postNotificationName:@"popoverShouldDismiss" object:nil];

Fazer isso envia uma notificação ao aplicativo e, como você registrou seu outro controlador de exibição para ouvi -lo, sempre que vê essa notificação, ele chama o seletor que você especificar, neste caso, demitir a OPPOPOVER.

2) Faça uma hierarquia de pontos de vista para encontrar auto.popovercontroller

Confira isso, o seu será diferente, certamente, mas a idéia geral é a mesma. Comece no seu AppDelegate, mova -se para o primeiro ViewController, mova -se para subviews até chegar a si mesmo.

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!

Espero que isto ajude

Isso é muito mais fácil porque o PopOverController é uma propriedade. Facilita a referência.

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];
}

Na verdade, acabei de perceber que você está se referindo ao código dentro do método delegado para exibir o ViewController no índice: 0 do seu SplitView. Essa resposta não se aplica necessariamente a isso, mas se aplica a qualquer outro momento que você esteja acessando e criando PopOverControllers no iPad. Sem verificar se um popover estiver visível primeiro, você falhará ou abrirá várias popovers.

Obrigado pelo seu tempo.

Você poderia tentar o abaixo

if(![popoverController isPopoverVisible]){
   // Show popover
}
else{
   // close popover
   [popoverController dismissPopoverAnimated:YES];
}

Se você estiver usando o padrão UISplitViewController Configuração, então o botão da barra de navegação que é criado exibe um povo RootViewController.

Se você quiser ter certeza de que não tem vários pop-ups de uma só vez, você pode simplesmente descartar pop-ups sempre que o seu RootViewController vai aparecer. Aqui está o código que eu costumava resolver este problema:

- (void) viewWillAppear:(BOOL)animated {
  if ([self.popover isPopOverVisible]) {
    [self.popover dismissPopoverAnimated:YES];
  }
  [super viewWillAppear:YES];
}

O código que eu costumava mostrar o popover no 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];
}

Eu costumava tentar descartá -lo de outra aula:

-(IBAction)saveAddCategory:(id)sender {
  rootViewController = [[RootViewController alloc] init];
  [rootViewController dismissPopover];
}

Meu dismissPopover Função parece:

- (void) dismissPopover {
  if ([self.addCategoryPopover isPopoverVisible]) {
    [self.addCategoryPopover dismissPopoverAnimated:YES];
  }
  if (addCategoryPopover.popoverVisible == YES) {
    [addCategoryPopover dismissPopoverAnimated:YES];
  }
}

Sim, você pode definir o modalPresentationStyle como segue:

controller.modalPresentationStyle = UIModalPresentationFormSheet;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top