这是我的代码。
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-推荐答案 strong>
如果我正确理解您的意图,您是在要求让框架进行相应的调用,所以您期望
[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/
|