将导航项中的 rightbarbuttonitem 设置为 nil 不会消失

setting rightbarbuttonitem in navigation item to nil doesn't disappear

我有一个带有 class FSDDropdownPicker(下拉菜单)的对象,我想编辑下拉菜单中的一个条目。这样做后,我将对象更改为 nil,并将右栏按钮项更改为 nil,但即使在实例化新下拉菜单并将其添加到右栏按钮项之后,旧的下拉菜单仍然存在。

    if(_picker){
//        _picker.tableView.delegate = nil;
//        _picker.tableView.dataSource = nil;
//        _picker.delegate = nil;
        self.navigationItem.rightBarButtonItem = nil;
//        [_picker removeFromSuperview];
//        _picker.view
    }

    _picker =  [self.navigationItem addDropdownPickerWithOptions:[arr copy]];
    _picker.delegate = self;

我也有这样的功能,如果菜单变空,我会完全删除下拉菜单,然后

if([api.myGroups count]==0){
    self.navigationItem.rightBarButtonItem = nil;
    return;
}

但是我的 rightBarButtonItem 保持不变。添加注释:如果有影响但实际上不应该,我也在使用 AMSlideMenu。

即使在 re-adding 新选择器之后,FSDDropdownPicker 仍将旧的 tableView 保留在视图层次结构中,因此请尝试在添加新选择器之前调用 [_picker removeFromSuperview];

此外,无需调用 [self.view setNeedsDisplay];nil 委托和数据源。看来你只需要重新分配它。

此外,self.navigationItem.rightBarButtonItem = _picker; 行是多余的,因为 navigationItem 上的类别方法 addDropdownPickerWithOptions: 已经将新创建的选择器分配给 navigationItem

编辑:糟糕,您需要在创建新选择器之前调用此代码:

for (UIView *view in self.navigationController.navigationBar.superview.subviews) {
    if ([view isKindOfClass:[UITableView class]]) {
        [view removeFromSuperview];
    }
}

不幸的是,库本身并没有处理这个问题,所以你要么这样做,要么创建一个 pull request 来修复 FSDDropdownPicker 库。

编辑编辑: 如果您不使用 CocoaPods,您可以尝试将 table 视图和 options 定义放在头文件中 - 这不是一个很好的解决方案,但现在对您来说可能是最简单的。移动这个 @property (strong, nonatomic) UITableView *tableView; 和此 @property (strong, nonatomic) NSArray *options; 行到 FSDDropdownPicker.h 并且您不必每次想要 add/delete 一个项目时都创建新的选择器实例。只需 add/delete 一个项目到选项并重新加载 table 视图。