2012-01-23 2 views
1

IBOutletCollection内のすべてのUIViewを無効/有効にしたいとします。 しかし、私はsetEnabledを直接呼び出すことはできませんので、UIViewsクラスで異なります。IBOutletCollection内のすべてのサブビューを無効にする

次に、performSelectorメソッドを使用すると思っていましたが、Object asパラメーターのみを送信できます。

私はこのサイトと他のサイト([NSNumber numberWithBool YES/NO])で読むことができますが、bool YESまたはNOのいずれかを指定してNSNumberを送信すると、有効な状態は変更されません。

私は、しかし、私は彼らが有効になってそれを設定する方法を見つけることができませんでした、nilを使用して動作するように無効部分を得た:

コントロールはUISliders、UIButtons、UITextViewsとUITextfieldsからなるIBOutletCollectionある
-(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; 
    } 
} 

。注(@property (strong, nonatomic) IBOutletCollection(UIView) NSArray *controls;

UITextViewsは細かいウィット上記のコードを動作し、それはsetEnabledを使用UIViews、唯一の他のタイプです。

答えて

1

タッチイベントを許可しない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 
    } 
} 
+0

ありません;) – Tyilo

+0

クール。実際に 'userInteractionEnabled'を使用できない場合は、コードのリビジョンを編集しました。これは私が推測するのは、将来の参照のためだけです。 – NJones

0

(もちろん、あなたが使用するすべてのクラスを列挙する必要があります)昨日自分自身でこの問題に対して私の場合、userInteractionEnabledを設定するだけでは十分ではありませんでした。なぜなら、タッチイベントへの応答を停止するのではなく、コントロールがグレー表示されたかったからです。また、カスタムの有効/無効の動作を持つUIViewサブクラスがいくつかありました。将来、コントロールを追加する場合に備えて@NJonesとしてすべてのクラスを列挙する必要はありません。

OPが記載されているので、NSNumberを使用すると機能しません。解決策は、this questionに対するTomSwiftの答えで説明されているようにNSInvocationを使用することです。私は便利な機能でこれをラップすることを決めた:

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); 
関連する問題