2011-08-10 19 views
0

我有一個UIViewCustom類有7個孩子。 孩子的每個有自己的類函數用於幫助在一個UITableView我選擇的類別和功能的一個啓動NSClassFromString(MyClassName)比調用MyClass的類函數

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

「-insertNewObjectWithClassName:(的NSString *)childClassName」被調用。

在此功能,我想這取決於在類名來創建實例,所以我tryed

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

但不幸的是靜態函數不能被調用。

有沒有辦法,說編譯器,該類不只是一個類,但也是一個MotherClass告訴他的功能?

非常感謝你!

編輯: 警告:語義問題:方法-minWidth'未找到(返回類型默認爲 '身份證')

SOLUTION:Class類,而不是類*類

回答

2

這個答案似乎是相關的: How do I call +class methods in Objective C without referencing the class?

可以定義具有要打電話,然後有類似的方法的接口:

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

這應該消除編譯器警告並使您的代碼類型安全。

+0

謝謝你,你是我的英雄!警告已經離開 – Seega

+0

很高興我可以幫助:D – Sam

+0

這將工作,但協議是矯枉過正。我會去抽象基類,並簡單地聲明'class'是'MyAbstractBase * class'。這是更清晰和更具指示性的意圖;協議的功能分佈在類層次結構中。在這種情況下,你們所有的自定義類都以「UIView」的一個基本子類爲根源(我猜測UIView)。 – bbum

2
  • Objective-C沒有靜態函數。它有方法;類或實例。

  • 不要在get前加方法;這是爲特定用例保留的,這不是它。

您的代碼看起來或多或少正確。你確定childClassName包含類的正確名稱嗎?

一般來說,你的問題表明對Objective-C的理解有點缺乏,或者至少是Obj-C像C++(或Java)那樣工作的假設。我會建議您仔細閱讀language documentation,因爲它會回答各種元問題,這些問題將使這一切變得非常清晰。

+0

好吧我猜對了類功能 – Seega

+1

@Seega:不是類**功能**。他們是**方法**。它們被調用的方式與調用函數的方式不同。 –

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 
+0

嗨,我用Class * theClass = NSClassFromString(className); 所以指針是問題 – Seega

+0

啊!感謝您的高舉。 –