问题
I want to implement different targets in different cases to a button.
If its the own profile of the current user, the button should add the target "go to settings". If its a different user, I want to add a follow/unfollow action.
After checking all parameters, my code should work. But it doesn't work. I added some prints but the button is not clickable.
func setupUserInformation(user: UserModel) {
usernameLabel.text = user.username
if user.uid == UserApi.shared.CURRENT_USER_ID {
editButton.setTitle("Einstellungen", for: .normal)
editButton.addTarget(self, action: #selector(goToSettings), for: .touchUpInside)
} else {
if user.isFollowing! == true {
setupUnfollowButton()
} else {
setupFollowButton()
}
}
}
@objc func goToSettings() {
delegate?.goToSettingVC()
}
func setupFollowButton() {
editButton.layer.borderWidth = 1
editButton.layer.borderColor = UIColor.lightGray.cgColor
editButton.layer.cornerRadius = 5
editButton.clipsToBounds = true
editButton.setTitleColor(UIColor.white, for: .normal)
editButton.backgroundColor = UIColor(red: 1 / 255, green: 84 / 255, blue: 147 / 255, alpha: 1.0)
editButton.setTitle("Folgen", for: UIControl.State.normal)
editButton.addTarget(self, action: #selector(followAction), for: .touchUpInside)
}
@objc func followAction() {
print("Button wurde gedrückt")
if user?.isFollowing == false {
FollowApi.shared.followAction(withUser: user!.uid!)
setupUnfollowButton()
user?.isFollowing = true
}
}
func setupUnfollowButton() {
editButton.layer.borderWidth = 1
editButton.layer.borderColor = UIColor.lightGray.cgColor
editButton.layer.cornerRadius = 5
editButton.clipsToBounds = true
editButton.setTitleColor(UIColor.black, for: .normal)
editButton.backgroundColor = UIColor.white
editButton.setTitle("Entfolgen", for: UIControl.State.normal)
editButton.addTarget(self, action: #selector(unFollowAction), for: .touchUpInside)
}
@objc func unFollowAction() {
print("Button wurde gedrückt")
if user?.isFollowing == true {
FollowApi.shared.unfollowAction(withUser: user!.uid!)
setupFollowButton()
user?.isFollowing = false
}
}
Many thanks in advance for your help!
UPDATE
Made some changes as in the answers below. But still the add target will be not carried out.
var user: UserModel? {
didSet {
guard let _user = user else { return }
setupUserInformation(user: _user)
}
}
func setupUserInformation(user: UserModel) {
editButton.addTarget(self, action: #selector(didTapEditButton), for: .touchUpInside)
if user.uid == UserApi.shared.CURRENT_USER_ID {
editButton.setTitle("Einstellungen", for: .normal)
}else {
if user.isFollowing! == true {
setupUnfollowButton()
} else {
setupFollowButton()
}
}
}
@objc func didTapEditButton() {
//Add IF conditions according to what your button should do in different cases here.
if user!.uid == UserApi.shared.CURRENT_USER_ID {
editButton.setTitle("Einstellungen", for: .normal)
goToSettings()
}else {
if user!.isFollowing! == true {
unFollowAction()
} else {
followAction()
}
}
}
@objc func goToSettings() {
delegate?.goToSettingVC()
}
func setupFollowButton() {
editButton.layer.borderWidth = 1
editButton.layer.borderColor = UIColor.lightGray.cgColor
editButton.layer.cornerRadius = 5
editButton.clipsToBounds = true
editButton.setTitleColor(UIColor.white, for: .normal)
editButton.backgroundColor = UIColor(red: 1 / 255, green: 84 / 255, blue: 147 / 255, alpha: 1.0)
editButton.setTitle("Folgen", for: UIControl.State.normal)
}
func followAction() {
print("Button wurde gedrückt")
if user?.isFollowing == false {
FollowApi.shared.followAction(withUser: user!.uid!)
setupUnfollowButton()
user?.isFollowing = true
}
}
func setupUnfollowButton() {
editButton.layer.borderWidth = 1
editButton.layer.borderColor = UIColor.lightGray.cgColor
editButton.layer.cornerRadius = 5
editButton.clipsToBounds = true
editButton.setTitleColor(UIColor.black, for: .normal)
editButton.backgroundColor = UIColor.white
editButton.setTitle("Entfolgen", for: UIControl.State.normal)
}
func unFollowAction() {
print("Button wurde gedrückt")
if user?.isFollowing == true {
FollowApi.shared.unfollowAction(withUser: user!.uid!)
setupFollowButton()
user?.isFollowing = false
}
}
回答1:
Matt is right!! your approach is totally wrong here. Please try to modify your approach.
Your approach should be something like this:
override func viewDidLoad() {
super.viewDidLoad()
//Set Target to your button only once.
editButton.addTarget(self, action: #selector(didTapEditButton), for: .touchUpInside)
}
@objc func didTapEditButton() {
//Add IF conditions according to what your button should do in different cases here.
if user.uid == UserApi.shared.CURRENT_USER_ID {
goToSettings()
}else {
if user.isFollowing! == true {
setupUnfollowButton()
} else {
setupFollowButton()
}
}
}
func setupFollowButton() {
//Make the check to see what state your button is currently in by checking if the title of the button is "Follow" or "Unfollow"
if editButton.titleLabel?.text == "Unfollow"{
editButton.layer.borderWidth = 1
editButton.layer.borderColor = UIColor.lightGray.cgColor
editButton.layer.cornerRadius = 5
editButton.clipsToBounds = true
editButton.setTitleColor(UIColor.white, for: .normal)
editButton.backgroundColor = UIColor(red: 1 / 255, green: 84 / 255, blue: 147 / 255, alpha: 1.0)
editButton.setTitle("Follow", for: UIControl.State.normal)
followAction()
}
}
func setupUnfollowButton() {
//Do the same here for the other state.
if editButton.titleLabel?.text == "Follow"{
editButton.layer.borderWidth = 1
editButton.layer.borderColor = UIColor.lightGray.cgColor
editButton.layer.cornerRadius = 5
editButton.clipsToBounds = true
editButton.setTitleColor(UIColor.black, for: .normal)
editButton.backgroundColor = UIColor.white
editButton.setTitle("Unfollow", for: UIControl.State.normal)
unFollowAction()
}
}
func followAction() {
print("Button wurde gedrückt")
if user?.isFollowing == false {
FollowApi.shared.followAction(withUser: user!.uid!)
setupUnfollowButton()
user?.isFollowing = true
}
}
func unFollowAction() {
print("Button wurde gedrückt")
if user?.isFollowing == true {
FollowApi.shared.unfollowAction(withUser: user!.uid!)
setupFollowButton()
user?.isFollowing = false
}
}
回答2:
Note that adding a target does not execute the action code; it just sets up the button for what it will do when tapped by the user later.
Once you realize this, you will probably see that your whole approach here is probably a bad idea. Do not try to set the target and action conditionally. Instead just set the target and action once and for all. Then inside the action method, that is where you put conditions to decide what to do whenever the button is tapped.
回答3:
Solved the problem with the following code line:
cell.contentView.isUserInteractionEnabled = false
Just forgot to deactivate the user interaction with the collection view. When I tapped the button, the collection view header has been activated and not the button.
Thanks guys for your help!
来源:https://stackoverflow.com/questions/53546737/add-target-to-button-in-swift