對於客觀C來說,我很新奇,並想知道是否有人能夠幫助我解決這個問題。我有一些不同的方法,每一個都需要3個輸入值和正常使用目標C使用字符串來調用方法
[self methodA:1 height:10 speed:3]
調用它,但該方法的名字,我想從一個字符串中的plist看了這麼例如,如果字符串是的methodB我會得到
[self methodB:1 height:10 speed:3]
爲 「methodC」
[self methodC:1 height:10 speed:3]
等。
任何想法我怎麼可能做到這一點我試圖定義字符串使用NSSelectorFromString
NSString *string = [plistA objectForKey:@"method"];
SEL select = NSSelectorFromString(string);
[self performSelector:select:c height:b speed:a];
然而,這並沒有工作,要麼任何幫助,將不勝感激一個選擇。 已經嘗試了下面的解決方案,但無法在這裏工作是我試過的。
所以剛開始我有方法,如
spawnEnemyA:2 withHeight:3 withSpeed:4
spawnEnemyB:3 withHeight:2 withSpeed:5
,我想讀書,我想通過這些方法,以及從plist文件的方法類型的值。我的代碼如下,//////////////////////////////////////////// //////////////////
//這是我從我想要的plist中讀取的值我的方法使用
int a = [[enemySettings objectForKey:@"speed"] intValue];
int b = [[enemySettings objectForKey:@"position"] intValue];
int c = [[enemySettings objectForKey:@"delay"] intValue];
// I Also read the method name from the plist and combine it into a single string
NSString *method = [enemySettings objectForKey:@"enemytype"];
NSString *label1 = @"spawn";
NSString *label2 = @":withHeight:withSpeed:";
NSString *combined = [NSString stringWithFormat:@"%@%@%@",label1, method,label2];
//Check that the string is correct get spawnEnemyA:withHeight:withSpeed:
CCLOG(@"%@",combined);
//This is the Invocation part
NSInvocation * invocation = [ NSInvocation new ];
[ invocation setSelector: NSSelectorFromString(combined)];
[ invocation setArgument: &c atIndex: 2 ];
[ invocation setArgument: &b atIndex: 3 ];
[ invocation setArgument: &a atIndex: 4 ];
[ invocation invokeWithTarget:self ];
[invocation release ];
/// ////////////////////////////////////////////////// ///////////////
代碼編譯時沒有任何錯誤,但方法未被調用。有任何想法嗎?乾杯
您需要將調用轉換爲objc_msgSend()才能使其正確。 – bbum
初學者可能有點低級; )還要記住,如果你需要一個返回值,還有'objc_msgSend_fpret'(浮點返回)和'objc_msgSend_stret'(結構返回)。 – Macmade
是的,我可以想象它可能有點低級,但至少你可以學習Obj-C是如何構建在C上的:)在這裏查看關於這個方法的更多細節:http://stackoverflow.com/questions/2573805/using-objc-msgsend-to-call-a-objective-c-function-with-named-arguments – Jack