• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - UIButton performSelector :withObject:withObject: not making call

[复制链接]
菜鸟教程小白 发表于 2022-12-12 20:50:46 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

这是我的代码。

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(110, 270, 100, 40);
    button.backgroundColor = [UIColor grayColor];
    [button setTitle"next" forState:UIControlStateNormal];
    [self.view addSubview:button];

我想通过这个方法设置按钮标题颜色 但它不起作用!

    [button performSelectorselector(setTitleColor:forState
                 withObject:[UIColor blackColor]
                 withObject(UIControlStateNormal)];

有人知道为什么它不起作用吗???


感谢大家的帮助。 昨晚,我找到了一种使它起作用的方法。无论参数是 UIControlStateNormal(一种特殊情况)还是其他类似 UIControlStateHighlighted。 代码如下:

     [button performSelectorselector(setTitleColor:forState
                  withObject:[UIColor blueColor]
                  withObject__bridge id)((void *)UIControlStateNormal)];
     [button performSelectorselector(setTitleColor:forState
                  withObject:[UIColor blackColor]
                  withObject__bridge id)((void *)UIControlStateHighlighted)];
     [button performSelectorselector(setTitleColor:forState
                  withObject:[UIColor redColor]
                  withObject__bridge id)((void *)UIControlStateSelected)];

所以问题解决了。


我发现它很有用!所以我想用它做更多的事情, 代码如下:

    [button.layer performSelectorselector(setMasksToBounds withObject__bridge id)((void *)YES)];
    [button.layer performSelectorselector(setCornerRadius withObject__bridge id)((void *)5)];
    [button.layer performSelectorselector(setBorderWidth withObject__bridge id)((void *)5)];
    [button.layer performSelectorselector(setBorderColor withObject__bridge id)(__bridge CGColorRef)[UIColor greenColor]];

当我测试时,我发现它再次不起作用!太失望了。如果有人对这个问题感兴趣,你可以测试一下。



Best Answer-推荐答案


如果我正确理解您的意图,您是在要求让框架进行相应的调用,所以您期望

[button performSelector:@selector(setTitleColor:forState
                 withObject:[UIColor blackColor]
                 withObject:@(UIControlStateNormal)];

打电话

[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

您在这里遗漏了一件重要的事情:performSelector:withObject:withObject: 需要两个 objects。您将纯整数值(因为 UIControlStateNormal 是一些 int/enum 值)包装在 NSNumber 中。现在该对象(或指针,或地址,或任何你称之为的)作为第二个参数传递给 setTitleColor:forState: 这显然不是值本身,但因为该方法不知道这样,它将值解释为某种整数值。

所以稍后会调用这样的东西:

NSNumber *number = ...; // your number object
[button setTitleColor:[UIColor blackColor] forState:number];

正如另一个答案所说,它可能通过在此处省略 @(...) 运算符来工作,以便该值不包含在 NSNumber 中。这将发生:NSControlStateNormal 被定义为 0。因此编译器会将其解释为 nil,这是一个有效的对象,或者缺少一个对象。 nil 稍后将被重新解释为整数值作为 UIControlState,所以你的 0 (== UIControlStateNormal) 再次。

这是一个有效的特殊情况,因为 0 可能被视为 nil。它不能与任何其他值一起工作(通常甚至不能编译),即 UIControlStateFocused。你会得到一个 “无法使用 '(anonymous enum ...)' 类型的右值初始化 'id' 类型的参数”错误。

如果你坚持走 performSelector: 路线,你可以添加这样的方法:

-(void)setPropertiesNSDictionary *)props onButtonUIButton *)button {
   UIColor *color = props[@"color"];
   NSNumber *stateWrapper = props[@"state"];
   UIControlState state = (UIControlState)stateWrapper.unsignedIntegerValue;
   [button setTitleColor:color forState:state];
}

并像这样使用它:

[self performSelector:@selector(setPropertiesnButton 
           withObject:@{@"color" : [UIColor blackColor], 
                        @"state" : [NSNumber numberWithUnsignedInteger:UIControlStateNormal]} 
           withObject:button];

将值包装到 NSValue 中甚至可能更简洁,或者为参数使用专用类等。

但是,无论如何,我更喜欢 dispatch_* 数学,即

dispatch_sync(dispatch_get_main_queue(), ^{
    [button setTitleColor:[UIColor blackColor] forState:number];
})

或者使用 dispatch_async 或者你当时的意图。

关于ios - UIButton performSelector :withObject:withObject: not making call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37962462/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap