2009-10-23 11 views
5

Używam ABPeoplePickerNavigationController, podklasy UINavigationController, aw kontekście, w którym używam go domyślny przycisk paska nawigacji po prawej stronie, "Anuluj", nie ma sensu. Nie mogę znaleźć sposobu na jego wyłączenie lub ukrycie, a jakakolwiek zastosowana metoda musi być publiczna i możliwa do zaakceptowania w sklepie. Pozbycie się paska nawigacji w całości (picker.navigationBarHidden = YES;) może być opcją, z tym wyjątkiem, że po powrocie do listy kontaktów pasek nawigacji pojawi się ponownie. Podklasy ABPeoplePickerNavigationController i przechwytywanie viewWillAppear, aby spróbować i zerować przycisk anulowania nie działa. [zestaw do pobieraniaAllowsAnuluj: NIE]; DZIAŁA, ale jest nieudokumentowany, więc oczekuję, że nigdy nie przejdzie zatwierdzenia.ABPeoplePickerNavigationController - usuń przycisk "Anuluj" bez korzystania z prywatnych metod/właściwości?

+0

spróbować https://gist.github.com/2970980 –

+0

To może pomóc http://www.scott-sherwood.com/ios5-removing-the-cancel-button-on-abpeoplepickernavigationcontroller/ – c0d3Junk13

+0

Utknąłem na tym samym problemie i po prostu chcę powiedzieć, że to absolutne wyśmiewanie się Apple . Tak, Twoja aplikacja zostanie odrzucona, jeśli użyjesz setAllowsCancel lub setAllowsCardEditing. – c0d3Junk13

Odpowiedz

0

Brak odpowiedzi na to pytanie - napisz nowy wybór osoby, jeśli nie możesz żyć z anulowaniem.

+0

Nie możesz po prostu napisać "wyboru osoby" - musisz poprosić o pozwolenie na książkę adresową, co obniży współczynnik konwersji; domyślny selektor osób firmy Apple nie wymaga uprawnień systemowych. – Zorayr

0

Możesz uzyskać przeglądanie wyników przez podglądy picker. Po prostu trochę nudne ...

0

Ustaw delegata na kontroler PeoplePickerController. W klasie delegatów użyj tej metody delegatów.

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

nie próbowałem tego jeszcze, ale myślę Uby mówi do iterację subviews z próbnika, aż znajdziesz taki, który jest isKindOfClass: [UIBarButtonItem klasa], a następnie można zmienić jego tytuł nieruchomość. Może również znajdować się w tablicy "Element" nawigacji.

0

Pamiętaj, aby ustawić delegata dla selektora obiektów (nie peoplePickerDelegate, tylko delegata) do klasy, które implementują następujące metody:

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

to działa dobrze, ale w iOS 4 jest jeszcze jedna rzecz, . Po przełączeniu z powrotem do mojej aplikacji przy użyciu funkcji Fast App Switching ponownie pojawia się przycisk anulowania.

Sposób

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

nie zostanie wywołana. Zrobiłem to:

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

Działa całkiem nieźle.

4

ten

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

działa idealnie!

2

Przykłady w niniejszym dokumencie za pomocą metody delegacyjnej navigationController: willShowViewController: animated: wykonaj pracę, ale może się zdarzyć, że chcesz dodać własny element nawigacyjny do swoich kontrolerów, a podane opcje usuwają wszystko, co możesz ustawić we własnych kontrolerach. Oto kod, który mam z powodzeniem stosowane, aby uzyskać tę opcję, aby dobrze pracować:

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

pamiętać, że istnieją dwa kontrolery Zobacz w stos kontrolera nawigacyjnego, jeden dla grup kontaktów i jeden na liście kontaktów. Właśnie dlatego nie możemy po prostu sprawdzić podglądu. Sterownik jest kontrolerem widoku kontrolera nawigacyjnego.

0

EDYCJA: Patrz uwagi poniżej. To jest teraz ilustracja tego, czego nie robić.

Próbowałem uzyskać pożądane zachowanie za pomocą publicznego interfejsu API, podklasy ABPeoplePickerNavigationController i przechwytywanie wszystkich zdarzeń, które zmieniają bieżący widok kontrolera widoku nawigacyjnego. Następnie można po prostu nawigować po hierarchii widoku i usuwać niechciane przyciski.

Możesz nawigować po hierarchii widoków od delegata, ale nie wiesz o zdarzeniach, które zmieniają stan widoku ... co utrudnia zabicie przycisku Anuluj i sprawienie, by się trzymał.

Ten kod rodzaj pracował dla mnie (uwaga: brute-force zabija wszystkie przyciski po prawej stronie):

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

BTW, masz rację viewWillAppear: (BOOL) nie działa. Musiałem wywołać killCancelButton po tym, jak widok jest już aktywny. Nie wygląda na glitchy na moim iPhone 4, ale może wydawać się zabawny na starszych/wolniejszych urządzeniach, jak przypuszczam. –

+0

Wygląda na urywany, ponieważ gdy ABPeoplePickerNavigationController pojawia się jako modalny, animuje się za pomocą przycisku Anuluj. Dopiero gdy się zatrzyma, przycisk zostanie usunięty. Argh. – n13

+0

Skończyło się na tym, że zbudowałem swój własny widok/kontroler uzyskując dane modelu ze struktury Książki adresowej, ponieważ w końcu okazało się to glitchy, jak wspomniano powyżej. Mam nadzieję, że nikogo nie wprowadziłem w brutalne poczucie bezpieczeństwa. –

0

według Russel b można po prostu zastąpi viewdidapper

ten pracował dla mnie:

- (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)]; 
} 
Powiązane problemy