【问题标题】:Add target to Button in Swift将目标添加到 Swift 中的按钮
【发布时间】:2018-11-29 20:05:20
【问题描述】:

我想在不同的情况下对一个按钮实现不同的目标。

如果它是当前用户自己的个人资料,则该按钮应添加目标“转到设置”。如果是其他用户,我想添加关注/取消关注操作。

检查所有参数后,我的代码应该可以工作了。但它不起作用。 我添加了一些打印,但按钮不可点击。

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

    }
}

非常感谢您的帮助!

更新

按照以下答案进行了一些更改。但是仍然不会执行添加目标。

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

    }
}

【问题讨论】:

  • “它不起作用”是什么意思?
  • 我的代码没有执行 addTarget。
  • 这是什么意思?您是否设置了断点并单步执行您的代码?
  • 是的。 “editButton.setTitle("Entfolgen", for: UIControl.State.normal)" 显示在我的应用程序中。但是代码不是通过“editButton.addTarget(self, action: #selector(unFollowAction), for: .touchUpInside)”运行的,并且打印不显示
  • 那是不可能的。如果执行了 Entfolgen 行,则在它之后执行下一行。

标签: swift uibutton


【解决方案1】:

马特是对的!你的方法在这里是完全错误的。请尝试修改您的方法。

你的方法应该是这样的:

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】:

    注意添加目标不会执行动作代码;它只是为用户稍后点击时将执行的操作设置按钮。

    一旦你意识到这一点,你可能会发现你在这里的整个方法可能是一个坏主意。不要试图有条件地设定目标和行动。相反,只需一劳永逸地设定目标和行动。然后在 action 方法中,您可以在其中放置条件来决定点击按钮时要执行的操作。

    【讨论】:

    • 感谢您的快速答复。如何在操作方法中添加条件?
    • 带字if
    【解决方案3】:

    使用以下代码行解决了问题:

    cell.contentView.isUserInteractionEnabled = false
    

    只是忘记停用用户与集合视图的交互。当我点击按钮时,集合视图标题已被激活,而不是按钮。

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 2016-12-20
      • 2018-11-04
      • 1970-01-01
      • 2016-05-15
      相关资源
      最近更新 更多