Frage

eine geteilte Ansicht auf dem iPad verwenden, habe ich den folgenden Code:

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

Das funktioniert gut, die popover zu zeigen, wenn die Taste gedrückt wird. Aber ich möchte auch die popover haben entlassen, wenn die Taste gedrückt wird, während es bereits geöffnet ist gut Richtlinien zu folgen. Wie würde ich mich über das tun dies? (Das heißt, wenn der Benutzer wiederholt auf diese Schaltfläche klickt, sollte der popover kommen und versteckt alle anderen Hits.)

War es hilfreich?

Lösung

Wenn splitViewController Anzeige popover, wird im folgenden Verfahren genannt werden. Nur überprüfen, ob nicht gleich Null, dann abzuweisen:)

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

Andere Tipps

Apple HIG sagt, dass es keine explizite Schaltfläche in einem popover entlassen werden sollte, sondern zu tun, was Sie fragen, haben Sie zwei Möglichkeiten.

1) Geben Sie eine kostenlose NSNotification

oder

2) bohrt in Ihre Ansicht Hierarchie nach unten, bis Sie die popover Instanz

1) in welcher auch immer sehen Sie präsentieren die popover in, in der viewDidLoad Methode:

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

erstellen eine Methode namens "dismissThePopover" und in der dealloc Methode, removeObserver

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

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

In Ihrem popoverController "entlassen" -Taste, geben Sie die folgende Zeile:

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

Dadurch, dass sendet eine Benachrichtigung an die Anwendung, und da Sie Ihre anderen View-Controller registriert haben für sie zu hören, wann immer es, dass eine Meldung sieht es die Wähler fordert Sie in diesem Fall angeben, dismissThePopover.

2) Drilldown in Ihre Ansicht Hierarchie self.popoverController finden

Überprüfen Sie dieses heraus, Sie werden anders sein, sicher, aber die allgemeine Idee ist die gleiche. Starten Sie an Ihrem AppDelegate, Umzug in den ersten Viewcontroller, Umzug in Subviews, bis Sie zu Ihrem self.popoverController Objekt.

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!

Hope, das hilft

Das ist viel einfacher, weil der popoverController eine Eigenschaft ist. Mach es zu Referenz einfacher.

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

Ich erkannte eigentlich nur, dass Sie auf den Code innerhalb des Delegatmethode sich beziehen für die Viewcontroller bei Index Anzeigen: 0 Ihrer SPLITVIEW-. Diese Antwort gilt nicht unbedingt das, aber Sie zugreifen zu jeder anderen Zeit gilt und popoverControllers auf dem iPad zu schaffen. Ohne zu prüfen, ob ein popover sichtbar ersten, werden Sie entweder zum Absturz bringen, oder öffnen Sie mehrere popovers.

Vielen Dank für Ihre Zeit.

Sie könnten die unten versuchen

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

Wenn Sie die Standard UISplitViewController Setup verwenden, dann die Navigationsleiste Taste, die zeigt ein popover Ihrer RootViewController erstellt wird.

Wenn Sie sicherstellen möchten, dass Sie nicht mehrere Pop-ups auf auf einmal haben, können Sie einfach entlassen Pop-ups, wenn Ihr RootViewController erscheint. Hier der Code I verwendet, um dieses Problem zu lösen:

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

Der Code, den ich verwenden, um die popover in RootViewController.m zeigen:

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

Das habe ich, um zu versuchen und zu entlassen es aus einer anderen Klasse:

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

Meine dismissPopover Funktion sieht aus wie:

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

Ja, können Sie die modalPresentationStyle gesetzt, wie folgend:

controller.modalPresentationStyle = UIModalPresentationFormSheet;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top