在UINavigationBar中自定义UIBarButtonItem视图

20

我正在为uinavigationbar制作自定义的工具栏按钮,我正在使用以下代码:

 UIImageView *backImgView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"chk_back.png"]]; [backImgView setUserInteractionEnabled:YES];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:backImgView];
[backButton setTarget:self];
[backButton setAction:@selector(BackBtn)];
checkIn_NavBar.topItem.leftBarButtonItem = backButton;

问题是它没有调用它的动作。我做错了什么?


你的 BackBtn 方法我能看一下吗? - Arthur
checkIn_NavBar是什么?你对它有一个强引用吗?为什么不使用self.navigationItem.leftBarButtonItem? - josh-fuggle
请尝试使用以下代码:[checkIn_NavBar setLeftBarButtonItem:backButton]; 或者 self.navigationItem.leftBarButtonItem=backButton; - Bonnie
checkIn_NavBar有一个强引用,而BackBtn方法没有被调用。 - Hassy
2个回答

51

来自苹果文档:
使用指定的自定义视图初始化新项目。

- (id)initWithCustomView:(UIView *)customView

参数 customView 表示该项的自定义视图。 返回值 具有指定属性的新初始化项。

讨论: 由此方法创建的工具栏按钮项不会在用户交互时调用其目标的操作方法。相反,工具栏按钮项期望指定的自定义视图处理任何用户交互并提供适当的响应。

解决方案:“使用您的背景图片创建按钮(将操作设置为此按钮),然后使用此按钮初始化工具栏按钮”。例如:

UIButton *btn =  [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(0,0,25,25)
[btn setBackgroundImage:[UIImage imageNamed:@"chk_back.png"] forState:UIControlStateNormal];
[btn addTarget:self action:@selector(BackBtn) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *barBtn = [[UIBarButtonItem alloc] initWithCustomView:btn];

4
好的回答,但是:文档中说:“创建自定义按钮(即类型为UIButtonTypeCustom的按钮)时,按钮的帧最初设置为(0, 0, 0, 0)。在将按钮添加到界面之前,您应该将其帧更新为更合适的值。”因此,您一定要设置按钮的帧,否则您将看不到任何东西! - Reinhard Männer
@ReinhardMänner - 你救了我的命,老兄!另外,那是一个可怕的帧默认值... - katzenhut
@katzenhut - 很高兴我能帮到你,你关于默认值的想法完全正确... - Reinhard Männer
我添加了框架的规范,并将其设置为75x44,与默认的UIBarButtonItem类似。让图像以25x25的可视区域为中心,周围是透明度。 - Elijah

1
我使用以下代码实现了这个功能:

UIButton *nxtBtn =  [UIButton buttonWithType:UIButtonTypeCustom];
[nxtBtn setImage:[UIImage imageNamed:@"chk_next.png"] forState:UIControlStateNormal];
[nxtBtn addTarget:self action:@selector(NextBtn) forControlEvents:UIControlEventTouchUpInside];
[nxtBtn setFrame:CGRectMake(0, 0, 64, 31)];
UIBarButtonItem *nextButton = [[UIBarButtonItem alloc] initWithCustomView:nxtBtn];

checkIn_NavBar.topItem.rightBarButtonItem=nextButton;

1
你要在一个按钮上添加另一个按钮?这听起来一点都不对。 - Popeye
@Popeye UIBarButtonItem 不是一个按钮,查看它的继承。 - Bryan Bryce
@BryanBryce 这太老了,我想我更多地是在说UIBarButtonItem本身就是一种按钮,而不一定是从UIButton继承而来的 - 谢谢你测试我的记忆力。 - Popeye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接