UIButButtonItem用UIButton作为CustomView - 来自UIButton,如何访问它的UIBarButtonItem?

时间:2012-02-29 20:02:20

标签: objective-c ios uibutton uibarbuttonitem

我有UIBarButtonItem UIButton作为自定义视图。

UIButton上有addTarget:action:。在动作中我提出了一个弹出窗口。我目前正在使用sender.frameUIButton的框架)来展示我想要呈现的UIBarButtonItem

如何从UIBarButtonItem

访问UIButton

5 个答案:

答案 0 :(得分:10)

如果您已将UIButton设置为customView的{​​{1}}或自定义视图的子项,那么您可以从按钮向上查看视图层次结构,直至找到包含该按钮的UIBarButtonItemUIToolbar,然后在条形图的项目中搜索其自定义视图为按钮(或按钮的祖先)的项目。

这是我完全未经测试的代码。您可以致电UINavigationBar获取包含按钮的项目。

[[self class] barButtonItemForView:myButton]

答案 1 :(得分:6)

首先,您为什么需要访问UIBarButtonItem

然后,要使用自定义视图创建UIBarButtonItem,我建议您创建类似以下内容的类别扩展名(在这种情况下,自定义视图为UIButton)。

//UIBarButtonItem+Extension.h    
+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image title:(NSString*)title target:(id)target action:(SEL)action;

//UIBarButtonItem+Extension.m    
+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image title:(NSString*)title target:(id)target action:(SEL)action
{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
    button.titleLabel.textAlignment = UITextAlignmentCenter;

    [button setBackgroundImage:image forState:UIControlStateNormal];
    [button setTitle:title forState:UIControlStateNormal];
    [button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem* barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];

    return [barButtonItem autorelease];    
}

并使用它(首次导入UIBarButtonItem+Extension.h):

UIBarButtonItem* backBarButtonItem = [UIBarButtonItem barItemWithImage:[UIImage imageNamed:@"YoutImageName"] title:@"YourTitle" target:self action:@selector(doSomething:)];

其中选择器是在使用该条形按钮项的类(目标)内实现的方法。

现在在doSomething:选择器中,您可以执行以下操作:

- (void)doSomething:(id)sender

    UIButton* senderButton = (UIButton*)sender;    
    [popover presentPopoverFromRect:senderButton.bounds inView:senderButton...];
}

在这种情况下,类别不重复代码很有用。希望它有所帮助。

P.S。我没有使用ARC,但也可以应用相同的考虑因素。

修改

访问栏按钮项的简单解决方案如下:

  1. 子类UIButton
  2. 在其中创建UIBarButtonItem类型的属性(避免保留周期的弱项)
  3. 创建时,在UIButton中注入条形按钮项目。
  4. 也许它可行,但我更喜欢第一个。

答案 2 :(得分:0)

不确定您是否需要UIButton。如果您正在执行的操作是调度操作,甚至使用图像自定义按钮,UIBarButtonItem就足够了。

如果你想要的是从UIButton抓取框架以实现演示,我认为你可以更好地估计UIBarButtonItem的位置。这应该不会太困难,特别是如果它是UINavigationItem leftBarButtonItem rightBarButtonItempresentPopoverFromBarButtonItem:permittedArrowDirections:animated:中的一个或另一个。

我一般都是为了KISS(保持简单,愚蠢!)的经验法则。即使Apple也这样做......当您从Springboard启动应用程序时,应用程序始终从屏幕中心扩展,而不是从应用程序的图标扩展。

只是一个建议。

修改

好的,我刚读过UIPopoverController reference(我从来没用过)。我想你想要的是@interface MyViewController : UIViewController { UIBarButtonItem *item; } @property (nonatomic, retain) UIBarButtonItem *item; @end @implementation MyViewController @synthesize item; -(void)viewDidLoad { // assuming item isn't in your NIB item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemPlus target:self action:@selector(doit)]; self.navigationItem.rightBarButtonItem = item; } -(void)doit { UIPopoverController *popover = [[[UIPopoverController alloc] initWithContentViewController:yourViewController] autorelease]; [popover presentPopoverFromBarButtonItem:self.item permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; // or in the line above, replace self.item with self.navigationItem.rightBarButtonItem } @end 并传递你的BBI作为第一个参数。该方法存在的原因是为了解决您的问题 - BBI没有框架,因为它们不是NSView的子类。 Apple知道你想做这种事情,并提供这种方法。此外,我认为如果您使用此方法,您的自动旋转也将起作用。我可能错了,试一试。

就您的自定义布局而言,我认为如果您在UIView中复制它并使用它进行BBI自定义,您将会做得更好。这当然取决于你。

无论哪种方式,您都可以通过将其作为IBOutlet与NIB连接来获得对BBI的引用,或者在代码中创建对它的保存引用。然后将该引用传递给我上面描述的popover方法。我认为这可能适合你。

MOAR

BBI只是您班级的一员 - 一个具有强大参考属性的iVar,可能与您的NIB连接成IBOutlet。然后,您可以从课程中想要的任何方法访问它。

示例:(不确定我是否具有popover控制器内存管理权限)

{{1}}

答案 3 :(得分:0)

假设您已将UIButton aButton添加到UIBarButtonItem info_Button,如下所示:

//Add a button on top of the UIBarButtonItem info_button
UIButton *aButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
[aButton addTarget:self action:@selector(showInfo:) forControlEvents:UIControlEventTouchUpInside];
info_Button.customView = aButton;

现在,在showInfo,presentPopoverFromBarButtonItem:info_Button(而不是presentPopoverFromBarButtonItem:sender)中,这将传递UIBarButtonItem info_button以使弹出工作:

- (IBAction)showInfo:(id)sender
{   
    [self.flipsidePopoverController presentPopoverFromBarButtonItem:info_Button   permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

}

答案 4 :(得分:0)

// get the UIBarButtonItem from the UIButton that is passed in sender
UIToolbar *toolbar = (id)[sender superview];
UIBarButtonItem *ourButtonItem = [toolbar items][2];//pick the right index
[parkingPopOver_ presentPopoverFromBarButtonItem:ourButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];