Objective-Cでメンバ変数に動的にアクセスする方法

平成22年4月25日(日) 10時18分48秒
区分
objective-c
報告者:
masuda

こんにちは。masudaです。

今回、複数回使い回したいViewがあったのですが、一方で様々なところで使われるものではありませんでした。
こんなときにわざわざクラスを作るのはどうも重い感じがしてしまいます。
そこでUIViewのサブクラスを作らずに、メソッドで作ることにしました。

  • UIViewController
    • 今回作成したいView
    • 今回作成したいView

というように複数個必要です。
このViewの中身はUILabelが2つだけ。

さらに出来ることなら、作成するViewの中身であるUILabelを、このViewを持っているViewControllerのメンバ変数からアクセスしたい。
以前はTagを割り当ててアクセスしていたのですが、以外と面倒だったのでそれ以外の方法がないかどうか調べてみました。

実際には以下のようなコードを使用することで出来ました。

#include <objc/runtime.h>
 
@implementation HogeViewController
 
- (UIView *)generateView:(NSString *)titleLabelName contentLabelName:(NSString *)contentLabelName
{
    UIView   *resultView;
    UILabel  *titleLabel, *contentLabel;
 
    // 便宜上CGRectZeroを使います。
    resultView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
 
    titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    [resultView addSubview:titleLabel];
    [titleLabel release];
 
    object_setInstanceVariable(self, [titleLabelName UTF8String], titleLabel);
 
    contentLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    [resultView addSubview:contentLabel];
    [contentLabel release];
 
    object_setInstanceVariable(self, [contentLabelName UTF8String], contentLabel);
 
    return resultView;
}
 
@end

titleLabelName, contentLabelNameにはそれぞれに割り当てたいメンバ変数の名称を指定します。
こんな感じにobject_setInstanceVariable関数を使用してあげれば、割り当てたいメンバ変数に割り当てることが出来ます。

P.S.
といいつつも、実は様々なところで使われる必要がわかり、まじめにUIViewのサブクラスを作成したため、上記のコードはお蔵入りになりました。

参考文献

トップページに戻る

本頁の来客数
五万三千百七十一名

メンバー一覧

アクトインディ技師部隊員名簿

アクトインディへ

投稿する

カテゴリー

アクトインディ

aaaa