将图像添加到UIBarButtonItem按钮

17
我已经使用以下代码在我的视图控制器上添加了UITabButtonItem。请问是否可能将图片与其关联起来?
UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(favouriteButtonClicked:)]; 
viewController2.navigationItem.rightBarButtonItem = button; 
[button release];
[self.navigationController pushViewController:viewController2 animated:YES];

我在其他地方使用以下代码,但是因为在上面的代码中我将视图控制器推入到当前视图中,所以这段代码不起作用。我必须使用上面的代码。

UIButton *button =  [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:[UIImage imageNamed:@"unselected.png"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(favouriteButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
[button setFrame:CGRectMake(280, 25, 30, 30)];
viewController2.navigationController.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease];

[self.navigationController pushViewController:viewController2 animated:YES];

我不知道出了什么问题,但是当我使用initWithBarButtonSystemItem替换这个自定义按钮代码时,它可以正常工作!!!

最终我解决了这个问题并在此发布了可用代码,但我仍然不明白为什么如果我在baseviewcontroller中有一个按钮,并像下面这样添加它,它就不能工作!!!我必须在viewwillappear中使用我的已接受答案中给出的代码!!

    [favButton addTarget:self action:@selector(favouriteButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
     self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease];  

以下代码仍然无法正常工作!!! 不知道发生了什么。

MPMoviePlayerViewController *videoController = [[[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:filePath]] autorelease];

UIButton* favouritebutton =  [UIButton buttonWithType:UIButtonTypeCustom];
[favouritebutton setBackgroundImage:[UIImage imageNamed:@"unselected.png"] forState:UIControlStateNormal];
[favouritebutton addTarget:self action:@selector(favouriteButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
[favouritebutton setFrame:CGRectMake(280, 25, 30, 30)];
videoController.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:favouritebutton] autorelease]; 

[self presentMoviePlayerViewControllerAnimated:videoController];

谢谢。


1
为什么不在您的viewController2的viewDidLoad方法中初始化按钮? - Maggie
7个回答

21
UIButton *favButton = [[UIButton alloc] init];

[favButton setImage:[UIImage imageNamed:@"unselected.png"] forState:UIControlStateNormal];
[favButton addTarget:self action:@selector(favouriteButtonClicked:)
   forControlEvents:UIControlEventTouchUpInside];

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

self.navigationItem.rightBarButtonItem = button;

[button release];
[favButton release];

如果说“不起作用”,你是指按钮没有显示出来还是favouriteButtonClicked方法没有被调用? - Maggie
按钮根本没有显示出来!我还尝试在我的视图控制器的didviewload方法中放置代码。我使用[self.navigationController.view addSubview:favButton];方法将这个已经声明和初始化在basecontroller中的喜爱按钮放在所有的控制器中,它可以正常工作。它只在一个视图控制器中没有起作用,而不同之处在于它是从父视图推出的。唯一有效的方法是使用带有initWithBarButtonSystemItem的UIBarButtonItem!!!我还尝试使用initwithImage却不起作用!!!不确定出了什么问题! - Paresh Masani
3
玛吉,你的代码可以工作,但我似乎只需要为按钮设置框架! - Paresh Masani
我一看到就会立即通知你。 - Maggie
我发布了一个回答,其中包含Maggie的解决方案,适用于Swift - CodeMonkey
显示剩余4条评论

9
UIButton *button =  [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];
 [button addTarget:self action:@selector(methodAction:) forControlEvents:UIControlEventTouchUpInside];
[button setFrame:CGRectMake(0, 0, 49, 30)];
 navController.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease];

将其分配给导航控制器,您也可以按照我的代码中所述设置图像。


只会有一个视图控制器。您需要仅为该视图控制器修改按钮。因此,请使用self.navigationController。 - Praveen S
我尝试在视图控制器的didviewload方法中按照您建议的方法进行操作,并使用self.navigationController.navigationItem.rightBarButtonItem来设置自定义按钮,但是按钮根本不出现! 请还看一下我对Maggie的评论回复。谢谢。 - Paresh Masani
关于设置按钮框架,您是正确的,但我需要将按钮添加到self.navigationItem而不是self.navigationcontroller.navigationitem中。谢谢。 - Paresh Masani
Praveen,我好像不能接受多个答案!你们两个都帮了我同样出色的忙,但Maggie也给了我一个想法:在viewdidload中添加代码来解决问题! - Paresh Masani
好的,我只是想让你发展Stackoverflow文化。我也会给她的答案点赞。 - Praveen S

5
好的。最终我解决了这个问题。感谢Maggie和Praveen。只有你们两个答案里的代码片段对我起作用:)
UIButton *button =  [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:[UIImage imageNamed:@"unselected.png"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(favouriteButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
[button setFrame:CGRectMake(280, 25, 30, 30)];
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease];

感谢您的选择。

你在一开始的错误是: viewController2.navigationController.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease]。 你应该只使用 viewController2.navigationItem.rightBarButtonItem - Maggie
如果我在推送viewcontroller2之前放置它,就无法工作,就像我在问题中提到的那样。只有在didviewload中执行才有效! - Paresh Masani

2

Maggie 的优秀解决方案在 Swift 中的应用:

let favButton = UIButton()
favButton.setImage(UIImage(named: "unselected"), forState: .Normal)
favButton.addTarget(self, action: "favouriteButtonClicked:", forControlEvents: .TouchUpInside)
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: favButton)

1
你也可以通过在工具栏上放置一个圆角按钮,然后更改该圆角按钮的图像并将按钮设置为自定义类型,直接从 XIB 进行设置。还应将按钮的背景设置为透明色。

这也是一个不错的想法,但对于MPMoviePlayerViewController,您没有XIB文件。那么你会怎么做呢? - Paresh Masani

1
这是一个使用Maggie的答案的Swift函数:
class func returnBarButtonItemWithImage(theImageName:String, andDownImage theDownImageName:String, andSize theSize:CGFloat, withAction theAction:Selector, andTarget theTarget:AnyObject)->UIBarButtonItem? {

    if let myImage = UIImage(named:theImageName) {

        var myButton = UIButton(frame: CGRectMake(0, 0, theSize, theSize))

        myButton.setImage(myImage, forState: UIControlState.Normal)

        myButton.addTarget(theTarget, action: theAction, forControlEvents: UIControlEvents.TouchUpInside)

        if let myDownImage = UIImage(named: theDownImageName) {

            myButton.setImage(myDownImage, forState: UIControlState.Selected)
        }

        return UIBarButtonItem(customView: myButton)
    }

    return nil
}

0

UIButton *button = [[UIButton alloc] init];

[button setImage:[UIImage imageNamed:@"settings"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(RightBarMethod:)
    forControlEvents:UIControlEventTouchUpInside];
[button setFrame:CGRectMake(0, 0, 20, 20)];

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

self.navigationItem.rightBarButtonItem = barButtonItem;

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