这是我的代码。
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]];
当我测试时,我发现它再次不起作用!太失望了。如果有人对这个问题感兴趣,你可以测试一下。
如果我正确理解您的意图,您是在要求让框架进行相应的调用,所以您期望
[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/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |