我有UIBarButtonItem
UIButton
作为自定义视图。
UIButton
上有addTarget:action:
。在动作中我提出了一个弹出窗口。我目前正在使用sender.frame
(UIButton
的框架)来展示我想要呈现的UIBarButtonItem
。
如何从UIBarButtonItem
?
UIButton
答案 0 :(得分:10)
如果您已将UIButton
设置为customView
的{{1}}或自定义视图的子项,那么您可以从按钮向上查看视图层次结构,直至找到包含该按钮的UIBarButtonItem
或UIToolbar
,然后在条形图的项目中搜索其自定义视图为按钮(或按钮的祖先)的项目。
这是我完全未经测试的代码。您可以致电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,但也可以应用相同的考虑因素。
修改强>
访问栏按钮项的简单解决方案如下:
UIButton
UIBarButtonItem
类型的属性(避免保留周期的弱项)UIButton
中注入条形按钮项目。也许它可行,但我更喜欢第一个。
答案 2 :(得分:0)
不确定您是否需要UIButton。如果您正在执行的操作是调度操作,甚至使用图像自定义按钮,UIBarButtonItem
就足够了。
如果你想要的是从UIButton
抓取框架以实现演示,我认为你可以更好地估计UIBarButtonItem
的位置。这应该不会太困难,特别是如果它是UINavigationItem
leftBarButtonItem
rightBarButtonItem
或presentPopoverFromBarButtonItem: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];