非Static なUITableView のUITableViewCell 上に配置したUIView を取得する

投稿者: | 2013/07/29

非Static なUITableView __つまりDynamic Prototypes なUITableView__のUITableViewCell 上のUIViewは、UITableViewCell も含めて動的に用意されるので、普通にIBOutlet とかでつかまえようとすると怒られます。

Illegal Configuration: Connection "myUIViewOutletName" cannot have a prototype object as its destination.

とか言われちゃうわけです。

 

cell.subViews objectAtIndex: じゃダメ

正直、ナメてました。

UITableViewCell を取得して、subViews 総ナメでNSStringFromClass:でクラス名で探せば一発だろうと。

 

UITableViewCellContentView て何よ

UITableViewCell のsubViews を確認してみたところ、アイテム数は1つだけ。
UITableViewCellContentView という名前のクラスでした。

 

結局、力技

結局、UITableViewCellContentView をUIView* で取得して、そのsubViews から更に目的のUIView をクラス名の一致で探すという力技に落ち着きました。

コードはこんな感じ。

static NSString* const CELL_IDENTIFIER = @"CellIdentifier";
static NSString* const CLASS_NAME = @"UITableViewCellContentView";
static NSString* const VIEW_NAME = @"UITextView";
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:CELL_IDENTIFIER];
    
    for ( UIView* tvccv in cell.subviews ) {
		if ( [NSStringFromClass(tvccv.class) isEqualToString:CLASS_NAME] ) {
			for ( UIView* myView in tvccv.subviews ) {
				if ( [NSStringFromClass(myView.class) isEqualToString:VIEW_NAME] ) {
					// ここで取得したUIView* をキャストして色々すればOK
					// 例:このコードではVIEW_NAME = @"UITextView" なので、(UITextView*)でキャスト
                }
            }
                
        }
    }
    
    return cell;
}

 

参考

ググって見つけた、@hachinobu1 さんの以下の記事を参考にさせて頂きました。
__つか、まんまです__


 



 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください