我希望禁用/启用IBOutletCollection中的所有IBOutletCollection。但是UIViews的类不同,所以我不能直接调用setEnabled。
然后,我想我应该使用performSelector方法来完成它,但是我只能发送一个对象作为参数。
我在这个站点和其他站点上都看到我可以使用[NSNumber numberWithBool YES/NO],但是当发送带有bool或NO的NSNumber时,启用的状态不会改变。
我通过使用nil使禁用部分工作,但是我找不到一种方法将其设置为启用的:
-(void) setControlsState: (BOOL) enabled
{
for(UIView *subview in controls)
{
NSNumber *boolObject = enabled? [NSNumber numberWithBool: YES]: nil;
if([subview respondsToSelector: @selector(setEnabled:)])
{
[subview performSelector: @selector(setEnabled:) withObject: boolObject];
}
else if([subview respondsToSelector: @selector(setEditable:)])
{
[subview performSelector: @selector(setEditable:) withObject: boolObject];
}
subview.alpha = enabled? 1: 0.5;
}
}其中控件是一个IBOutletCollection,由UISliders、UIButtons、UITextViews和UITextfields组成。(@property (strong, nonatomic) IBOutletCollection(UIView) NSArray *controls;)
注意: UITextViews在上面的代码中工作得很好,它只是使用setEnabled的另一种类型的UIViews。
发布于 2012-01-23 22:04:31
你不使用不允许触摸事件的userInteractionEnabled有什么特别的原因吗?
-(void) setControlsState: (BOOL) enabled
{
for(UIView *aView in controls)
{
if ([aView isKindOfClass:[UIView class]]){
aView.userInteractionEnabled = enabled;
aView.alpha = (enabled)?1.0:0.5;// Be mindful of this it doesn't seem to respect group opacity. i.e. sliders look funny.
}
}
}如果存在,可以简单地在检查aView指针的类之后进行转换,如下所示:(当然,您必须枚举使用的所有类)。
-(void) setControlsState: (BOOL) enabled
{
for(UIView *aView in controls)
{
if ([aView isKindOfClass:[UISlider class]]){
[(UISlider *)aView setEnabled:enabled];
}
if ([aView isKindOfClass:[UITextView class]]){
[(UITextView *)aView setEditable:enabled];
}
// and so forth
}
}发布于 2015-12-29 00:29:25
昨天我自己遇到了这个问题。在我的例子中,设置userInteractionEnabled是不够的,因为我希望控件看起来是灰色的,而不仅仅是停止对触摸事件的响应。我还有一些具有自定义启用/禁用行为的UIView子类,而且我不想像@NJones建议的那样枚举所有类,以防将来添加更多控件。
正如OP所指出的,使用NSNumber不起作用。解决方案是使用NSInvocation,如TomSwift对this question的回答中所解释的那样。我决定将它包装在一个方便的函数中:
void XYPerformSelectorWithBool(id obj, SEL selector, BOOL boolean)
{
NSMethodSignature *signature = [[obj class] instanceMethodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setSelector:selector];
[invocation setArgument:&boolean atIndex:2];
[invocation invokeWithTarget:obj];
}然后,禁用所有控件的简单方法如下:
for (UIView *view in controls)
if ([view respondsToSelector:@selector(setEnabled:)])
XYPerformSelectorWithBool(view, @selector(setEnabled:), NO);https://stackoverflow.com/questions/8979057
复制相似问题