アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

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

こんにちは。masudaです。

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

  • UIViewController
    • 今回作成したいView
    • 今回作成したいView
    </ul>

    というように複数個必要です。
    この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のサブクラスを作成したため、上記のコードはお蔵入りになりました。

    参考文献