我想禁用/启用IBOutletCollection中的所有UIView。
但是UIViews在类上有所不同,因此我不能直接调用setEnabled

然后我以为我会使用performSelector方法来执行此操作,但是我只能发送一个Object作为参数。

我在该站点和其他我只能使用[NSNumber numberWithBool YES/NO]的站点上都阅读了,但是当发送带有boolean YES或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。

最佳答案

您没有使用禁止触摸事件的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
    }
}

09-25 19:12