isKindOfClassを使用して特定のクラスを判別する | 成長の果実

成長の果実

不完全でも良いから前に進む。

よくビューにボタンとかラベルとか乗せると思うけど、そのビューに例えばボタンクラスが含まれているかどうかを調べたいときには、isKindOfClassというものを使って判別できる。

これだけだと使い道があまりよく分からないだろうけど、判別した後にそのクラスに処理を与えることも可能だから結構使い道はあったりする。



実際にみたほうが分かると思うので、早速サンプルコードのほうを書いて説明していく。



実装内容は下記。

1.BaseViewを作成して、UIButtonを5つ乗せる。
2.FirstViewControllerを作成して、BaseViewを乗せる。その際に、isKindOfClassを使用してBaseViewに乗っているUIButtonを判別し、ボタンに処理を与える。



以下コード。

主要部分だけを説明していく。赤字の部分がポイント箇所。



◎BaseView.h

#import <UIKit/UIKit.h>


/* Delegate */

@protocol BaseViewDelegate <NSObject>

@optional

- (void)btn1Delegate:(id)sender;
- (void)btn2Delegate:(id)sender;
- (void)btn3Delegate:(id)sender;
- (void)btn4Delegate:(id)sender;
- (void)btn5Delegate:(id)sender;

@end


/* UIView */

@interface BaseView : UIView

@property (unsafe_unretained, nonatomic) id <BaseViewDelegate> delegate;

- (void)btnAction:(UIButton*)sender;

@end



◎BaseView.m

#import "BaseView.h"

@implementation BaseView

@synthesize delegate = _delegate;


- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.backgroundColor = [UIColor whiteColor];

// ボタン1
UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn1.frame = CGRectMake(0.0, 0.0, 180.0, 30.0);
btn1.center = CGPointMake(self.frame.size.width / 2, 100.0);
btn1.tag = 1;
[btn1 setTitle:@"有効状態です。" forState:UIControlStateNormal]; // 有効時
[btn1 setTitle:@"ハイライト状態です。" forState:UIControlStateHighlighted]; // ハイライト時
[btn1 setTitle:@"無効状態です。" forState:UIControlStateDisabled]; // 無効時
[btn1 addTarget:self action:@selector(btnAction:)forControlEvents:UIControlEventTouchUpInside];
[self addSubview:btn1];

// ボタン2
UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn2.frame = CGRectMake(btn1.frame.origin.x, btn1.frame.origin.y + btn1.frame.size.height + 30, btn1.frame.size.width, btn1.frame.size.height);
btn2.tag = 2;
[btn2 setTitle:@"有効状態です。" forState:UIControlStateNormal]; // 有効時
[btn2 setTitle:@"ハイライト状態です。" forState:UIControlStateHighlighted]; // ハイライト時
[btn2 setTitle:@"無効状態です。" forState:UIControlStateDisabled]; // 無効時
[btn2 addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:btn2];

// ボタン3
UIButton *btn3 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn3.frame = CGRectMake(btn2.frame.origin.x, btn2.frame.origin.y + btn2.frame.size.height + 30, btn2.frame.size.width, btn2.frame.size.height);
btn3.tag = 3;
[btn3 setTitle:@"有効状態です。" forState:UIControlStateNormal]; // 有効時
[btn3 setTitle:@"ハイライト状態です。" forState:UIControlStateHighlighted]; // ハイライト時
[btn3 setTitle:@"無効状態です。" forState:UIControlStateDisabled]; // 無効時
[btn3 addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:btn3];

// ボタン4
UIButton *btn4 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn4.frame = CGRectMake(btn3.frame.origin.x, btn3.frame.origin.y + btn3.frame.size.height + 30, btn3.frame.size.width, btn3.frame.size.height);
btn4.tag = 4;
[btn4 setTitle:@"有効状態です。" forState:UIControlStateNormal]; // 有効時
[btn4 setTitle:@"ハイライト状態です。" forState:UIControlStateHighlighted]; // ハイライト時
[btn4 setTitle:@"無効状態です。" forState:UIControlStateDisabled]; // 無効時
[btn4 addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:btn4];

// ボタン5
UIButton *btn5 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn5.frame = CGRectMake(btn4.frame.origin.x, btn4.frame.origin.y + btn4.frame.size.height + 30, btn4.frame.size.width, btn4.frame.size.height);
btn5.tag = 5;
[btn5 setTitle:@"有効状態です。" forState:UIControlStateNormal]; // 有効時
[btn5 setTitle:@"ハイライト状態です。" forState:UIControlStateHighlighted]; // ハイライト時
[btn5 setTitle:@"無効状態です。" forState:UIControlStateDisabled]; // 無効時
[btn5 addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:btn5];
}

return self;
}


/* ============================================================================== */
#pragma mark - Button Action
/* ============================================================================== */
- (void)btnAction:(UIButton*)sender
{
if (sender.tag == 1)
{
if ([self.delegate respondsToSelector:@selector(btn1Delegate:)])
{
[self.delegate btn1Delegate:sender];
}

}
else if (sender.tag == 2)
{
if ([self.delegate respondsToSelector:@selector(btn2Delegate:)])
{
[self.delegate btn2Delegate:sender];
}

}
else if (sender.tag == 3)
{
if ([self.delegate respondsToSelector:@selector(btn3Delegate:)])
{
[self.delegate btn3Delegate:sender];
}

}
else if (sender.tag == 4)
{
if ([self.delegate respondsToSelector:@selector(btn4Delegate:)])
{
[self.delegate btn4Delegate:sender];
}

}
else if (sender.tag == 5)
{
if ([self.delegate respondsToSelector:@selector(btn5Delegate:)])
{
[self.delegate btn5Delegate:sender];
}

}

}

@end




-------------------------------



◎FirstViewController.h

#import <UIKit/UIKit.h>
#import "BaseView.h"

@interface FirstViewController : UIViewController <BaseViewDelegate> {

}

@property (strong, nonatomic) BaseView *baseView;

@end



◎FirstViewController.m

#import "FirstViewController.h"

@implementation FirstViewController

@synthesize baseView = _baseView;

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.


/* BenuViewを設定 */

self.baseView = [[BaseView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height)];
self.baseView.delegate = self;
[self.view addSubview:self.baseView];


// 各ボタンのデフォルト処理
for (id view in self.baseView.subviews) {
if ([view isKindOfClass:[UIButton class]])
{
UIButton *btn = (UIButton*)view;

// ボタン1
if (btn.tag == 1)
{
//
}
// ボタン2
else if (btn.tag == 2)
{
btn.highlighted = YES; // ボタンをハイライト状態にする
btn.enabled = NO; // ハイライト状態のままボタンを無効化する
}
// ボタン3
else if (btn.tag == 3)
{
btn.enabled = NO; // ボタン無効化
}
// ボタン4
else if (btn.tag == 4)
{
//
}
// ボタン5
else if (btn.tag == 5)
{
btn.enabled = NO; // ボタン無効化
}
}
}

}


/* ============================================================================== */
#pragma mark - Delegate Method
/* ============================================================================== */
// ボタン1
- (void)btn1Delegate:(UIButton*)sender
{
NSLog(@"ボタン1です。");
}

// ボタン2
- (void)btn2Delegate:(UIButton*)sender
{
NSLog(@"ボタン2です。");
}

// ボタン3
- (void)btn3Delegate:(UIButton*)sender
{
NSLog(@"ボタン3です。");
}

// ボタン4
- (void)btn4Delegate:(UIButton*)sender
{
NSLog(@"ボタン4です。");
}

// ボタン5
- (void)btn5Delegate:(UIButton*)sender
{
NSLog(@"ボタン5です。");
}


@end




全然説明してないけど、冒頭に書いたとおりBaseViewではただUIButtonを5つ作成しているだけ。

そして、FistViewControllerではBaseVIewを表示させて、表示させる際にisKindOfClassを使用してBaseViewのUIButton判別し、更にボタンを無効化したりハイライト状態にしている。



ビルドして実行した結果が下記画像。

$成長の果実-SampleIsKindOfClass01



結構ざっくり書いたけど、isKindOfClassは結構使い道あると思う。


----------
サンプルソース:https://github.com/tetsuco/SampleIsKindOfClass