ABPeoplePickerNavigationController - 删除“取消”按钮而不使用私有方法/属性?

时间:2009-10-23 05:18:41

标签: iphone iphone-sdk-3.0 uinavigationbar

我正在使用ABPeoplePickerNavigationController,UINavigationController的子类,在我正在使用的上下文中,右侧的默认导航栏按钮“取消”没有任何意义。我找不到禁用或隐藏它的方法,无论使用哪种方法都需要公开和存储可批准。 完全摆脱导航栏(picker.navigationBarHidden = YES;)可能是一个选项,除了弹出回到联系人列表后导航栏重新出现。 对ABPeoplePickerNavigationController进行子类化并拦截viewWillAppear以尝试取消按钮按钮无法正常工作。 [picker setAllowsCancel:NO];是否有效,但没有证件,所以我希望永远不会通过批准。

10 个答案:

答案 0 :(得分:4)

这一个

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

完美无缺!

答案 1 :(得分:2)

此处的示例使用委托方法navigationController:willShowViewController:animated:do work,但可能是您希望在自己的控制器中添加自己的导航项,并且给定的选项将删除您可能设置的任何内容你自己的控制器。这是我成功用来使这个选项运行良好的代码:

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

请注意,导航控制器堆栈中有两个视图控制器,一个用于联系人组,另一个用于联系人列表。这就是我们不能只检查视图控制器是导航控制器的顶视图控制器的原因。

答案 2 :(得分:0)

没有答案 - 如果你不能接受取消,请写一个新的人选择器。

答案 3 :(得分:0)

您可以通过选择器子视图浏览该结果。只是有点无聊......

答案 4 :(得分:0)

将委托设置为PeoplePickerController控制器。 在委托类中,有这个委托方法。

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

答案 5 :(得分:0)

我还没有尝试过,但我认为Uby说要遍历选择器的子视图,直到找到一个isKindOfClass:[UIBarButtonItem类]然后你可以改变它的title属性。它也可能位于navigationBar的'Item'数组中。

答案 6 :(得分:0)

确保将picker对象的委托(而不是peoplePickerDelegate,只是委托)设置为实现以下方法的类:

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

答案 7 :(得分:0)

它工作正常,但在iOS 4中还有一件事。当我使用快速应用切换功能切换回我的应用时,再次出现取消按钮。

方法

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

没有被调用。所以我做到了:

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

效果很好。

答案 8 :(得分:0)

编辑:见下面的评论。现在这是不该做的事情的例证。

我尝试通过继承ABPeoplePickerNavigationController并拦截更改当前导航视图控制器视图的所有事件来获取公共API的所需行为。然后,您可以浏览视图层次结构并清除所有不需要的按钮。

您可以从委托中导航视图层次结构,但您不知道更改视图状态的事件...这使得很难终止取消按钮并使其坚持。

此代码有点为我工作(注意:它强力杀死所有右手按钮):

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

答案 9 :(得分:0)

根据罗素b,您可以覆盖 viewdidappear

这对我有用:

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