23

我在最新的 Xcode 11.0 中遇到了奇怪的错误 我的代码:

let button = ASAuthorizationAppleIDButton(type: .default, style: .black)
button.translatesAutoresizingMaskIntoConstraints = false
button.cornerRadius = 10
button.addTarget(self, action: #selector(appleSignInButtonSelected(_:)), for: .touchUpInside)

选择器从未调用过,但如果我将事件更改为 touchDown,一切正常。

4

6 回答 6

26

我认为这是苹果虫。使用 touchDown 而不是 touchUpInside。

于 2019-12-11T19:20:35.470 回答
22

我遇到过同样的问题。就我而言,我已UITapGestureRecognizer附加到视图控制器的主视图。将手势识别器的属性设置cancelsTouchesInView为 false 有帮助。

于 2019-11-14T16:34:53.927 回答
2

我发现最好的方法就是使用 UITapGestureRecognizer

let button = ASAuthorizationAppleIDButton()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleAuthorizationAppleIDButtonPress))
button.addGestureRecognizer(tapGesture)

将 addTarget(_:action:for:) 与 .touchDown 一起使用将需要用户在检测到异常操作之前长按按钮(比正常时间长约 1 秒)。

Apple 甚至拒绝了我提交的应用程序,因为“点击使用 Apple 登录按钮没有产生任何操作”。

我建议只使用轻击手势识别器来避免任何问题。

于 2020-07-13T15:40:13.310 回答
1

我的问题ASAuthorizationAppleIDButton是没有在项目目标中添加“使用 Apple 登录”功能。 XCode 中的功能截图

添加时ASAuthorizationControllerDelegate,您需要检查日志:

@available(iOS 13.0, *)
extension SignInViewController: ASAuthorizationControllerDelegate {

func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
    print("Error: \(error.localizedDescription)")
}

}

于 2020-07-24T12:07:19.917 回答
1

我发现如果其父级存在布局问题,则ASAuthorizationAppleIDButton根本没有收到任何点击手势(down或)。upInside

就我而言,我在其中一个父视图中遗漏了一个约束,这导致它ASAuthorizationAppleIDButton位于父视图的框架之外。

这是在故事板中,所以有一个红色箭头和警告,但我最初错过了。我通过调试视图层次结构并注意每个祖先视图在树上的位置发现了这一点。

解决方法是确保存在约束以将其保持ASAuthorizationAppleIDButton在其祖先的框架内。

于 2020-04-12T19:22:35.883 回答
0

编辑 2020-06-16:

苹果最近修复了这个问题。现在AuthorizationAppleIDButtonButton可以触发UIControl.Event.touchUpInside.

UIControl.Event.primaryActionTriggered虽然,与UIButton 不同,它不绑定.touchUpInside


原答案:

如果您在Apple 的示例应用程序中替换touchUpInsidefor登录 (Juice),它也不起作用,所以我猜按钮本身存在问题。primaryAction

除了这种解决方法,我没有找到其他解决方案。该操作将被触发,primaryActionTriggered并且登录按钮将正常显示高亮动画。

@available(iOS 13.0, *)
class SignInWithAppleButton: UIButton {
    private var action: (() -> Void)?
    private let authorizationAppleIDButtonButton = ASAuthorizationAppleIDButton()

    override var isHighlighted: Bool {
        didSet {
            super.isHighlighted = isHighlighted
            authorizationAppleIDButtonButton.isHighlighted = isHighlighted
        }
    }

    class func make(action: @escaping (() -> Void)) -> SignInWithAppleButton {
        let button = SignInWithAppleButton(type: .custom)
        button.setup()
        button.action = action
        return button
    }

    private func setup() {
        addSubviewToFill(authorizationAppleIDButtonButton)
        addTarget(self, action: #selector(triggerAction), for: .primaryActionTriggered)
        authorizationAppleIDButtonButton.isUserInteractionEnabled = false
    }

    @objc private func triggerAction() {
        action?()
    }
}
于 2020-05-07T15:27:59.330 回答