iOS Objective-C中IB添加TWTRLogInButton后回调不触发问题
问题原因分析及解决方案
哈哈,这个问题我之前帮朋友排查过,其实是你不小心把IB创建的按钮和代码创建的按钮搞混啦!
核心问题所在
当你通过Interface Builder拖出TWTRLogInButton并关联到twitterButton这个IBOutlet后,在viewDidLoad里执行self.twitterButton = [TWTRLogInButton buttonWithLogInCompletion:...],这相当于:
- 创建了一个全新的
TWTRLogInButton实例,并且给它绑定了回调block - 把
twitterButton这个IBOutlet的引用指向了这个新实例 - 但这个新按钮根本没有被添加到你的视图层级里——屏幕上显示的还是IB拖出来的那个旧按钮,而旧按钮从来没设置过登录完成的回调block,所以点击后自然不会触发回调逻辑。
正确的解决方法
根据你的需求(用IB控制按钮位置和尺寸),有两种简单的修正方式:
方式一:直接给IB创建的按钮设置回调(推荐)
不需要重新创建按钮,直接给IB已经生成好的按钮实例绑定回调block即可:
- (void)viewDidLoad { [super viewDidLoad]; // 直接给IB关联的按钮设置回调,不要重新赋值self.twitterButton self.twitterButton.logInCompletion = ^(TWTRSession *session, NSError *error) { // 这里写你的登录完成逻辑 if (session) { NSLog(@"登录成功,用户ID:%@", session.userID); } else { NSLog(@"登录失败:%@", error.localizedDescription); } }; }
方式二:用IB做布局容器,代码创建按钮
如果你更习惯用代码创建按钮,但想利用IB来控制位置和尺寸,可以用一个容器视图过渡:
- 在IB里拖一个普通
UIView作为容器,设置好你需要的位置、尺寸约束,关联到IBOutlet(比如叫twitterButtonContainer) - 在
viewDidLoad里创建按钮并添加到容器中,让按钮填满容器:
- (void)viewDidLoad { [super viewDidLoad]; TWTRLogInButton *logInButton = [TWTRLogInButton buttonWithLogInCompletion:^(TWTRSession *session, NSError *error) { // 登录完成逻辑 if (session) { NSLog(@"登录成功,用户名:%@", session.userName); } else { NSLog(@"登录取消或失败:%@", error.localizedDescription); } }]; // 关闭自动布局转换,用Auto Layout约束按钮和容器对齐 logInButton.translatesAutoresizingMaskIntoConstraints = NO; [self.twitterButtonContainer addSubview:logInButton]; [NSLayoutConstraint activateConstraints:@[ logInButton.topAnchor.constraintEqualToAnchor:self.twitterButtonContainer.topAnchor, logInButton.leadingAnchor.constraintEqualToAnchor:self.twitterButtonContainer.leadingAnchor, logInButton.trailingAnchor.constraintEqualToAnchor:self.twitterButtonContainer.trailingAnchor, logInButton.bottomAnchor.constraintEqualToAnchor:self.twitterButtonContainer.bottomAnchor ]]; }
这样既保留了IB布局的灵活性,又能确保按钮的回调正常触发。
内容的提问来源于stack exchange,提问作者Sjakelien
相关产品推荐
相关产品推荐

