0

7人の子を持つUIViewCustomクラスを取得しました。それぞれの子供たちは、開始を支援するための独自のクラス機能を持っていました

+(int) minHeight;
+(int) minWidth;

UITableViewでクラスの1つを選択すると、関数 "-insertNewObjectWithClassName:(NSString *)childClassName"が呼び出されます。

その関数では、クラス名に応じてインスタンスを作成したいので、試してみました

Class *class = NSClassFromString(childClassName);
CGRect frame = CGRectMake(0, 0, [class minWidth], [class minWidth])
MotherClass *view = [[class alloc] initWithFrame:frame];

ただし、残念ながら静的関数を呼び出すことはできません。

クラスは単なるクラスではなく、関数を伝えるためのマザークラスでもあるとコンパイラーに言う方法はありますか?

どうもありがとうございます!

編集:警告:セマンティックの問題:メソッド'-minWidth'が見つかりません(戻りタイプのデフォルトは'id'です)

解決策:Class*classの代わりにClassclass

4

3 に答える 3

3

他の場所で何かが間違っている必要があります。たとえば、渡すクラスの名前です。このデモプログラムは期待どおりに機能します(簡潔にするためにレイアウトを圧縮しました)。

#import <Foundation/Foundation.h>

@interface MyChild
+ (int) minHeight;
+ (int) minWidth;
@end

@implementation MyChild
+ (int) minHeight { return 100; }
+ (int) minWidth { return 300; }
@end

int main(int argc, const char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString *className = [NSString stringWithString: @"MyChild"];
    Class theClass = NSClassFromString(className);
    NSLog(@"%d %d", [theClass minHeight], [theClass minWidth]);

    [pool drain];
    return 0;
}

出力:

2011-08-10 18:15:13.877 ClassMethods[5953:707] 100 300
于 2011-08-10T16:17:23.773 に答える
2

この答えは関連しているようです:クラスを参照せずにObjectiveCで+classメソッドを呼び出すにはどうすればよいですか?

呼び出したいメソッドを持つインターフェースを定義してから、次のようにすることができます。

Class<MyCoolView> class = NSClassFromString(childClassName);
CGRect frame = CGRectMake(0, 0, [class getMinWidth], [class getMinWidth]);
MotherClass *view = [[class alloc] initWithFrame:frame];

これにより、コンパイラの警告がなくなり、コードがタイプセーフになります。

于 2011-08-10T15:50:01.837 に答える
2
  • Objective-Cには静的機能はありません。メソッドがあります。クラスまたはインスタンス。

  • getメソッドの前に;を付けないでください。これは特定のユースケースのために予約されていますが、そうではありません。

あなたのコードは多かれ少なかれ正しいように見えます。childClassNameクラスの正しい名前が含まれていますか?

一般に、あなたの質問は、Objective-Cについての理解が少し不足していること、または少なくとも、Obj-CがC ++(またはJava)のように機能するという仮定を示しています。言語ドキュメンテーションを熟読することをお勧めします。それは、これらすべてをかなり明確にするさまざまなメタ質問に答えるからです。

于 2011-08-10T15:50:54.217 に答える