2010-05-08 1 views
0

Я хочу сохранить URL-адрес против UILabel, чтобы при касании пользователем ярлыка он попадал на этот URL-адрес в UIWebView.Использование объектов object-c с NSDictionary

Я объявил 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

Не уверен, что это является причиной ошибки, но urlToLinkDictionary устанавливается с помощью 'Словарь NSDictionaryWithObjects', и в этом случае setValue в цикле должен завершиться ошибкой. Используйте 'NSMutableDictionary dictionaryWithObjects'. Кроме того, строка alloc + init над словаремWithObjects не нужна и приводит к утечке. – DyingCactus

ответ

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:
  • Кажется немного бессмысленным для поиска словаря путем выполнения линейного поиска через его ключи.