ABPEOPLEPICKERNAVIGATIONCONTROLLER - Schaltfläche „Abbrechen“ entfernen, ohne private Methoden/Eigenschaften zu verwenden?

StackOverflow https://stackoverflow.com/questions/1611499

Frage

Ich verwende den ABPEOPLEPICKERNAVIGATIONCONTROLLER, eine Unterklasse von UinavigationController, und im Kontext verwende ich sie mit der Standard -NAV -Balken -Taste für die rechte Seite, "abbrechen", keinen Sinn. Ich kann keinen Weg finden, ihn zu deaktivieren oder zu verbergen, und die verwendete Methode muss öffentlich und im Laden angesehen sein. Die Ganze der Navigationsleiste (picker.navigationBarhidden = Ja;) vollständig zu entfernen, kann eine Option sein, außer dass nach dem Rückgang in die Liste der Kontakte die NAV -Balken wieder auftaucht. AbpeoplepickernAvigationController subklassigen und die Abnahme von ViewWillappear, um zu versuchen, die Abbrechen -Taste nicht zu versuchen, hat nicht funktioniert. [picker setallowscancel: nein]; Funktioniert aber undokumentiert, so dass ich erwarte, dass niemals die Genehmigung bestehen würde.

War es hilfreich?

Lösung 3

Es gibt keine Antwort darauf - schreiben Sie einen neuen Person -Picker, wenn Sie nicht mit dem Abbrechen leben können.

Andere Tipps

Dieses hier

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
  UIView *custom = [[UIView alloc] initWithFrame:CGRectMake(0.0f,0.0f,0.0f,0.0f)]; 
  UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithCustomView:custom]; 
  //UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addAction)]; 
  [viewController.navigationItem setRightBarButtonItem:btn animated:NO]; 
  [btn release]; 
  [custom release]; 
}

Funktioniert perfekt!

Die Beispiele hierin verwenden die Delegate -Methode NavigationController: WillshowViewController: Animated: Arbeit, aber es kann jedoch der Fall sein, dass Sie Ihr eigenes Navigationselement in Ihren eigenen Controllern hinzufügen möchten, und die angegebenen Optionen entfernen alles, was Sie in Ihren eigenen Controllern festlegen könnten . Hier ist Code, den ich erfolgreich verwendet habe, um diese Option gut zu machen: funktioniert:

- (void)navigationController:(UINavigationController *)navigationController
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated {

    // Here we want to remove the 'Cancel' button, but only if we're showing
    // either of the ABPeoplePickerNavigationController's top two controllers
    if ([navigationController.viewControllers indexOfObject:viewController] <= 1) {

        viewController.navigationItem.rightBarButtonItem = nil;
    }
}

Beachten Sie, dass sich im Stapel des Navigationscontrollers zwei Ansichtscontroller befinden, die für Kontaktgruppen und eine für die Kontaktliste. Aus diesem Grund können wir nicht einfach fi überprüfen, ob der ViewController der Top -Ansichtscontroller des Navigation Controllers ist.

Sie können dieses Ergebnis erzielen, das durch die Picker -Unteransichten stöbert. Nur ein bisschen langweilig ...

Ich habe es noch nicht ausprobiert, aber ich denke, Uby sagt, er solle durch die Unteransichten des Pickers iterieren, bis Sie eine finden, die ISKINDOFOFCASS ist: [UibarbuttonItem -Klasse] und dann können Sie die Eigentum von Titel ändern. Es könnte auch im "Item" -Array der Navigationsleiste liegen.

Setzen Sie den Delegieren von PeoplePickerController Controller. Haben Sie in der Delegiertenklasse diese Delegate -Methode.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
 UIView *pCustomView = [[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)];
 UIBarButtonItem *pBtn = [[UIBarButtonItem alloc] initWithCustomView:pCustomView];
 [viewController.navigationItem setRightBarButtonItem:pBtn animated:NO];
 [pBtn release];
 [pCustomView release];
}

Stellen Sie sicher, dass Sie den Delegierten für Picker -Objekt (nicht das peoplepickerdelegate, nur den Delegierten) auf die Klasse einstellen, die die folgende Methode implementiert:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
UIView *custom = [[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)];
UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithCustomView:custom];
[viewController.navigationItem setRightBarButtonItem:btn animated:NO];
[btn release];
[custom release];
} 

Es funktioniert gut, aber in iOS 4 gibt es noch eine Sache. Wenn ich mit der schnellen App -Switching -Funktion zu meiner App zurückkehre, wird die Schaltfläche Abbrechen erneut angezeigt.

Die Methode

- (void)navigationController:(UINavigationController *)navigationController  
      willShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animated

wird nicht angerufen. Also habe ich das gemacht:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    id topView = pickerControllerDelegate.peoplePicker.topViewController;
    topView.navigationItem.rightBarButtonItem = nil;
}

Es funktioniert ziemlich gut.

Laut Russel B könnten Sie Ihre nur überschreiben ViewDidapper

Das hat für mich funktioniert:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    UINavigationItem *item = (UINavigationItem *)[self.navigationBar.items lastObject];
    item.rightBarButtonItems = [[NSArray alloc] init];

    item.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addPerson)];
}

Bearbeiten: Siehe Kommentare unten. Dies ist jetzt ein Beispiel dafür, was nicht zu tun ist.

Ich habe versucht, das gewünschte Verhalten mit der öffentlichen API zu erhalten, indem ich AbpeoplepickernAvigationController subklassige und alle Ereignisse, die die aktuelle Ansicht der Navigation View Controller ändern, abfing. Dann kann man einfach durch die Ansichtshierarchie navigieren und alle unerwünschten Tasten reinigen.

Sie können die Ansichtshierarchie von einem Delegierten navigieren, aber Sie sind nicht mit den Ereignissen eingeweiht, die den Ansichtszustand ändern ... was es schwierig macht, den Abbrechen -Taste zu töten und es kleben zu lassen.

Dieser Code So'ne Art Arbeitete für mich (Hinweis: Es tötet die Brute-Force alle rechten Tasten):

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self killCancelButton];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [super pushViewController:viewController animated:animated];
    [self killCancelButton];
}

- (UIViewController*)popViewControllerAnimated:(BOOL)animated {
    UIViewController *result = [super popViewControllerAnimated:animated];
    [self killCancelButton];
    return result;
}

- (void)killCancelButton {
    for (NSUInteger itemIdx = 0; itemIdx < self.navigationBar.items.count; itemIdx++) {
        UINavigationItem *item = [self.navigationBar.items objectAtIndex:itemIdx];
        item.rightBarButtonItems = [[NSArray alloc] init];
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top