按下iOS swift后更改UIBarButtonItem图标

时间:2022-09-25 16:17:18

In the viewDidload method, I've declared a button and set RightBarButton...

在viewDidload方法中,我声明了一个按钮并设置了RightBarButton ...

    let btnFavourite = UIButton(frame: CGRectMake(0,0,30,30))
    btnFavourite.addTarget(self, action: "btnFavourite:", forControlEvents: .TouchUpInside)
    btnFavourite.setImage(UIImage(named: "star"), forState: .Normal)
    btnFavourite.setImage(UIImage(named: "star_filled"), forState: .Highlighted)
    let rightButton = UIBarButtonItem(customView: btnFavourite)
    self.navigationItem.setRightBarButtonItems([rightButton], animated: true)

How do I pressed the button from image 'star.png' then change to 'star_filled.png'? and press the button from 'star_filled.png' to 'star.png'?

如何从图像'star.png'按下按钮然后更改为'star_filled.png'?然后按'star_filled.png'中的按钮到'star.png'?

How to make two functions like

如何制作两个功能

func btnFavourite()
{
    //clicked the favourite button then image change to star_filled.png
}

fun btnUnfavourite()
{
    //clicked the button then the bar button image change to star.png
}

2 个解决方案

#1


5  

Create Method which will update you Button based on the state of self.isFavourited

Create Method将根据self.isFavourited的状态更新Button

var isFavourited = false;//declare this above the viewDidload()

func updateRighBarButton(isFavourite : Bool){
    let btnFavourite = UIButton(frame: CGRectMake(0,0,30,30))
    btnFavourite.addTarget(self, action: "btnFavouriteDidTap", forControlEvents: .TouchUpInside)


    if isFavourite {
         btnFavourite.setImage(UIImage(named: "star_filled"), forState: .Normal)
    }else{
        btnFavourite.setImage(UIImage(named: "star"), forState: .Normal)
    }
    let rightButton = UIBarButtonItem(customView: btnFavourite)
    self.navigationItem.setRightBarButtonItems([rightButton], animated: true)
}



func btnFavouriteDidTap()
{
    //do your stuff
    self.isFavourited = !self.isFavourited;
    if self.isFavourited {
        self.favourite();
    }else{
        self.unfavourite();
    }
    self.updateRighBarButton(self.isFavourited);
}


func favourite()
{
    //do your favourite stuff/logic
}

func unfavourite(){
    //do your unfavourite logic
}

In the viewDidload method, call first time, i.e.

在viewDidload方法中,第一次调用,即

self.updateRighBarButton(self.isFavourited);//first time self.isFavourited will be false

#2


1  

I'm sure there's a more elegant way to do it, but this is what worked for me:

我确信有一种更优雅的方式,但这对我有用:

In viewDidLoad():

    let share_button = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(shareTapped))
    let fave_button = UIBarButtonItem(image: UIImage(named: "icon-star"), style: .plain, target: self, action: #selector(favorite))
    let faved_button = UIBarButtonItem(image: UIImage(named: "icon-star-filled"), style: .plain, target: self, action: #selector(unfavorite))
    if YOUROBJECT.faved{
        navigationItem.rightBarButtonItems = [share_button, faved_button]
    }
    else{
        navigationItem.rightBarButtonItems = [share_button, fave_button]
    }

Then create the two #selector functions:

然后创建两个#selector函数:

@objc func favorite(){
    let share_button = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(shareTapped))
    let faved_button = UIBarButtonItem(image: UIImage(named: "icon-star-filled"), style: .plain, target: self, action: #selector(unfavorite))
    navigationItem.rightBarButtonItems = [share_button, faved_button]
    YOUROBJECT.faved = true
}
@objc func unfavorite(){
    let share_button = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(shareTapped))
    let fave_button = UIBarButtonItem(image: UIImage(named: "icon-star"), style: .plain, target: self, action: #selector(favorite))
    navigationItem.rightBarButtonItems = [share_button, fave_button]
    YOUROBJECT.faved = false
}

#1


5  

Create Method which will update you Button based on the state of self.isFavourited

Create Method将根据self.isFavourited的状态更新Button

var isFavourited = false;//declare this above the viewDidload()

func updateRighBarButton(isFavourite : Bool){
    let btnFavourite = UIButton(frame: CGRectMake(0,0,30,30))
    btnFavourite.addTarget(self, action: "btnFavouriteDidTap", forControlEvents: .TouchUpInside)


    if isFavourite {
         btnFavourite.setImage(UIImage(named: "star_filled"), forState: .Normal)
    }else{
        btnFavourite.setImage(UIImage(named: "star"), forState: .Normal)
    }
    let rightButton = UIBarButtonItem(customView: btnFavourite)
    self.navigationItem.setRightBarButtonItems([rightButton], animated: true)
}



func btnFavouriteDidTap()
{
    //do your stuff
    self.isFavourited = !self.isFavourited;
    if self.isFavourited {
        self.favourite();
    }else{
        self.unfavourite();
    }
    self.updateRighBarButton(self.isFavourited);
}


func favourite()
{
    //do your favourite stuff/logic
}

func unfavourite(){
    //do your unfavourite logic
}

In the viewDidload method, call first time, i.e.

在viewDidload方法中,第一次调用,即

self.updateRighBarButton(self.isFavourited);//first time self.isFavourited will be false

#2


1  

I'm sure there's a more elegant way to do it, but this is what worked for me:

我确信有一种更优雅的方式,但这对我有用:

In viewDidLoad():

    let share_button = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(shareTapped))
    let fave_button = UIBarButtonItem(image: UIImage(named: "icon-star"), style: .plain, target: self, action: #selector(favorite))
    let faved_button = UIBarButtonItem(image: UIImage(named: "icon-star-filled"), style: .plain, target: self, action: #selector(unfavorite))
    if YOUROBJECT.faved{
        navigationItem.rightBarButtonItems = [share_button, faved_button]
    }
    else{
        navigationItem.rightBarButtonItems = [share_button, fave_button]
    }

Then create the two #selector functions:

然后创建两个#selector函数:

@objc func favorite(){
    let share_button = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(shareTapped))
    let faved_button = UIBarButtonItem(image: UIImage(named: "icon-star-filled"), style: .plain, target: self, action: #selector(unfavorite))
    navigationItem.rightBarButtonItems = [share_button, faved_button]
    YOUROBJECT.faved = true
}
@objc func unfavorite(){
    let share_button = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(shareTapped))
    let fave_button = UIBarButtonItem(image: UIImage(named: "icon-star"), style: .plain, target: self, action: #selector(favorite))
    navigationItem.rightBarButtonItems = [share_button, fave_button]
    YOUROBJECT.faved = false
}