UIBarButtonItem with UIButton as CustomView - from UIButton, how to access the UIBarButtonItem its in?

前端 未结 5 775
误落风尘
误落风尘 2021-01-05 06:51

I have a UIBarButtonItem with UIButton as custom view.

The UIButton has a addTarget:action: on it. In the action

5条回答
  •  一向
    一向 (楼主)
    2021-01-05 07:43

    If you have set your UIButton as the customView of a UIBarButtonItem, or a child of the custom view, then you can walk up the view hierarchy from your button until you find the UIToolbar or UINavigationBar that contains the button, then search the bar's items for the one whose custom view is the button (or an ancestor of the button).

    Here's my completely untested code for doing that. You would call [[self class] barButtonItemForView:myButton] to get the item containing your button.

    + (BOOL)ifBarButtonItem:(UIBarButtonItem *)item containsView:(UIView *)view storeItem:(UIBarButtonItem **)outItem {
        UIView *customView = item.customView;
        if (customView && [view isDescendantOfView:customView]) {
            *outItem = item;
            return YES;
        } else {
            return NO;
        }
    }
    
    + (BOOL)searchBarButtonItems:(NSArray *)items forView:(UIView *)view storeItem:(UIBarButtonItem **)outItem {
        for (UIBarButtonItem *item in items) {
            if ([self ifBarButtonItem:item containsView:view storeItem:outItem])
                return YES;
        }
        return NO;
    }
    
    + (UIBarButtonItem *)barButtonItemForView:(UIView *)view {
        id bar = view;
        while (bar && !([bar isKindOfClass:[UIToolbar class]] || [bar isKindOfClass:[UINavigationBar class]])) {
            bar = [bar superview];
        }
        if (!bar)
            return nil;
    
        UIBarButtonItem *item = nil;
    
        if ([bar isKindOfClass:[UIToolbar class]]) {
            [self searchBarButtonItems:[bar items] forView:view storeItem:&item];
        }
    
        else {
            UINavigationItem *navItem = [bar topItem];
            if (!navItem)
                return nil;
            [self ifBarButtonItem:navItem.backBarButtonItem containsView:view storeItem:&item]
            || [self ifBarButtonItem:navItem.leftBarButtonItem containsView:view storeItem:&item]
            || [self ifBarButtonItem:navItem.rightBarButtonItem containsView:view storeItem:&item]
            || ([navItem respondsToSelector:@selector(leftBarButtonItems)]
                && [self searchBarButtonItems:[(id)navItem leftBarButtonItems] forView:view storeItem:&item])
            || ([navItem respondsToSelector:@selector(rightBarButtonItems)]
                && [self searchBarButtonItems:[(id)navItem rightBarButtonItems] forView:view storeItem:&item]);
        }
    
        return item;
    }
    

提交回复
热议问题