2010-05-08 36 views
0

我想要存儲一個URL到UILabel中,以便當用戶觸摸標籤時,它將它們帶到UIWebView中的那個URL。在NSDictionary中使用objective-c對象

我宣佈一個的NSDictionary像這樣:

NSMutableArray *linksArray = [[NSMutableArray alloc] init]; 
[linksArray addObject: [NSValue valueWithNonretainedObject: newsItem1ReadMoreLabel]]; 
[linksArray addObject: [NSValue valueWithNonretainedObject: newsItem2ReadMoreLabel]]; 
[linksArray addObject: [NSValue valueWithNonretainedObject: newsItem3ReadMoreLabel]]; 
[linksArray addObject: [NSValue valueWithNonretainedObject: newsItem4ReadMoreLabel]]; 
[linksArray addObject: [NSValue valueWithNonretainedObject: newsItem5ReadMoreLabel]]; 
//NSString *ageLink = @"http://www.theage.com.au"; 
NSArray *defaultLinks = [NSArray arrayWithObjects: @"1", @"2", @"3", @"4", @"5", nil]; 
self.urlToLinkDictionary = [[NSMutableDictionary alloc] init]; 
self.urlToLinkDictionary = [NSDictionary dictionaryWithObjects:defaultLinks forKeys:linksArray]; 

考慮到我使用的NSValue爲重點,如何獲取/設置與該鍵關聯的URL因爲我只有在UILabels引用?

這是我有什麼,但它不工作:

for(NSValue *key in [self.urlToLinkDictionary allKeys]) 
{ 
    if ([key nonretainedObjectValue] == linkedLabel) 
    { 
     [self.urlToLinkDictionary setValue:[newsItem link] forKey: key]; 
    } 
} 

,但我得到一個錯誤:「objc_exception_throw」解決

+0

不確定這是錯誤的原因,但是使用'NSDictionary dictionaryWithObjects'設置urlToLinkDictionary,在這種情況下,循環中的setValue應該失敗。使用'NSMutableDictionary dictionaryWithObjects'。此外,不需要dictionaryWithObjects上方的alloc + init行,並導致泄漏。 – DyingCactus 2010-05-08 02:37:19

回答

0

爲什麼不嘗試一個更簡單的方法。將標籤與每個標籤關聯。該標記是一個整數值,您可以使用它來查找數組中的url。

所以創建數組的代碼。

NSMutableArray* arrayURLs = [NSMutableArray arrayWithCapacity:2]; 
newsItem1ReadMoreLabel.tag = 0; 
[arrayURLs insertObject:urlStringforLabel1 atIndex:newsItem1ReadMoreLabel.tag]; 
newsItem2ReadMoreLabel.tag = 1; 
[arrayURLs insertObject:urlStringforLabel2 atIndex:newsItem2ReadMoreLabel.tag]; 

,那麼你可以訪問urlstring爲適當的標籤

NSString* url = [arrayURLs objectAtIndex:labelClicked.tag]; 
2

這兩條線是問題的原因:

self.urlToLinkDictionary = [[NSMutableDictionary alloc] init]; 
self.urlToLinkDictionary = [NSDictionary dictionaryWithObjects:defaultLinks forKeys:linksArray]; 

首先,你分配一個可變數組的財產。然後你爲屬性分配一個不同的不可變數組。你原來的可變數組泄漏,因爲你不釋放它。

異常正引起這一行:

[self.urlToLinkDictionary setValue:[newsItem link] forKey: key]; 

到時候你給它的時間,self.urlToLinkDictionary是不可改變的字典。你不能改變它。

還有其他問題:

  • linksArray泄漏,因爲你永遠不放開。
  • newsItem1ReadMoreLabel等等是什麼類型?你爲什麼用價值觀包裝他們?
  • setValue:forKey:是鍵值編碼的一部分。在一個可變的字典上它可以工作,但通過鍵訪問對象的正確方法是setObject:forKey:
  • 通過對其鍵進行線性搜索來搜索字典似乎有點沒有意義。
相關問題