簡體   English   中英

在NSDictionary中使用Objective-C對象

[英]Using objective-c objects with an NSDictionary

我想針對UILabel存儲URL,以便當用戶觸摸標簽時將其帶到UIWebView中的URL。

我已經這樣聲明了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作為鍵,考慮到我僅對UILabels的引用,如何獲取/設置與該鍵關聯的URL?

這是我所擁有的,但是不起作用:

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

但出現錯誤:“ objc_exception_throw”已解決

這兩行是導致此問題的原因:

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:
  • 通過對字典的鍵進行線性搜索來搜索字典似乎沒有意義。

為什么不嘗試更簡化的方法。 將標簽與每個標簽相關聯。 標簽是一個整數值,您可以使用它在數組中定位網址。

因此,用於創建數組的代碼。

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];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM