2010-10-18 108 views
1

我有2個對象,AddressBook和AddressCard。該地址卡的屬性名稱,電子郵件,&生日。 AddressBook具有將字符串作爲參數的查找方法,並且搜索每個添加的AddressCard進行匹配。在這個查找方法中,我想要在AddressCards中搜索每個字段的NSArray。然後遍歷每個AddressBook條目測試數組中的每個字段以匹配查找的參數。問題是我不知道如何使用字符串動態訪問對象屬性 - Objective-C中可能會這樣做,還是應該嘗試以不同的方式執行此操作?我意識到我可以使用IF語句,但那不是一個可擴展的解決方案。使用屬性名稱中的字符串動態訪問對象屬性Objective-C

繼承人我查詢方法:

-(AddressCard *)lookup:(NSString *)aName 
{ 
    NSArray *fields = [[NSArray alloc] initWithObjects:@"name",@"email",@"birthday",nil]; 
    BOOL STATUS = NO; 
    for(AddressCard *entry in book) 
    { 

     for(int i = 0; i < [fields count]; i++) 
     { 
      NSString *fieldName = [[NSString alloc] initWithString:[fields objectAtIndex:i]]; 
      NSRange range = [[entry fieldName] rangeOfString:aName]; 

      if(range.location != NSNotFound)//Important to not directly test the NSRange struct, but one of its properties(BAD_ACCESS) 
      { 
       NSLog(@"'%@' found in field:%@ at range:%i,%i",aName,fieldName,range.location,range.length); 
       STATUS = YES; 
       return entry; 
      } 
      [n release]; 
     } 

    } 
    if(!STATUS) 
     NSLog(@"'%@' not found in %@ address book",aName, bookName); 

    return nil; 
} 

任何意見或建議表示讚賞,謝謝!

+1

您正在泄漏'fields'和'fieldName'。實際上,你可以使用'NSString * fieldName = [field objectAtIndex:i];'。您應該執行** Build and Analyze **。 – dreamlax 2010-10-18 20:57:39

+0

上面不會編譯 - n應該是fieldName - 當我複製/粘貼時,我改變了它,但是謝謝你是正確的字段泄漏。 :-) – 2010-10-18 21:04:08

回答

4

你正在尋找的方法是valueForKey:

NSRange range = [[entry valueForKey:fieldName] rangeOfString:aName];
+0

條目是通過枚舉AddressCards枚舉返回的AddressCard對象,並且沒有valueForKey方法? – 2010-10-18 21:05:28

+0

只要地址卡從NSObject繼承,並使用@property聲明屬性,就可以免費獲得它(http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/BasicPrinciples。 html#// apple_ref/doc/uid/20002170-BAJEAIEE) – Aleph7 2010-10-18 21:34:01

+0

謝謝你 - 現在我有一個新問題,但我得到這個錯誤:NSUnknownKeyException',原因:'[ valueForUndefinedKey:] :這個類不是關鍵的生日密碼值。我打算谷歌這個,但我從來沒有得到那個錯誤.. – 2010-10-18 21:40:45

相關問題