首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用IBOutletCollection中的所有子视图

禁用IBOutletCollection中的所有子视图
EN

Stack Overflow用户
提问于 2012-01-23 21:46:04
回答 2查看 691关注 0票数 1

我希望禁用/启用IBOutletCollection中的所有IBOutletCollection。但是UIViews的类不同,所以我不能直接调用setEnabled

然后,我想我应该使用performSelector方法来完成它,但是我只能发送一个对象作为参数。

我在这个站点和其他站点上都看到我可以使用[NSNumber numberWithBool YES/NO],但是当发送带有bool或NO的NSNumber时,启用的状态不会改变。

我通过使用nil使禁用部分工作,但是我找不到一种方法将其设置为启用的:

代码语言:javascript
复制
-(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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-23 22:04:31

你不使用不允许触摸事件的userInteractionEnabled有什么特别的原因吗?

代码语言:javascript
复制
-(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指针的类之后进行转换,如下所示:(当然,您必须枚举使用的所有类)。

代码语言:javascript
复制
-(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
    }
}
票数 1
EN

Stack Overflow用户

发布于 2015-12-29 00:29:25

昨天我自己遇到了这个问题。在我的例子中,设置userInteractionEnabled是不够的,因为我希望控件看起来是灰色的,而不仅仅是停止对触摸事件的响应。我还有一些具有自定义启用/禁用行为的UIView子类,而且我不想像@NJones建议的那样枚举所有类,以防将来添加更多控件。

正如OP所指出的,使用NSNumber不起作用。解决方案是使用NSInvocation,如TomSwift对this question的回答中所解释的那样。我决定将它包装在一个方便的函数中:

代码语言:javascript
复制
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];
}

然后,禁用所有控件的简单方法如下:

代码语言:javascript
复制
for (UIView *view in controls)
    if ([view respondsToSelector:@selector(setEnabled:)])
        XYPerformSelectorWithBool(view, @selector(setEnabled:), NO);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8979057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档