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

区分
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のサブクラスを作成したため、上記のコードはお蔵入りになりました。

    参考文献

トップページに戻る

技師部隊からの
お知らせ

【求人】エンジニア募集しています。

本頁の来客数
八十七万千百七十六名以上(計測停止中)

メンバー一覧

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

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

アクトインディへ

カテゴリー

アクトインディ

aaaa