Предупреждение, генерируемое кодом установки UIButton - PullRequest
0 голосов
/ 23 апреля 2010

У меня есть цикл for, устанавливающий фоновые изображения для кнопок, в основном кнопки представляют собой миниатюры предварительного просмотра различных элементов и не могут быть установлены статически, однако код выдает предупреждение, потому что он проходит через все UIViews, но затем вызывает setBackgroundImage, который не распространяется на все виды. Предупреждение - это раздражение, я понимаю, на что оно жалуется, как от него избавиться? (Я не хочу отключать предупреждение, я хочу решить проблему)

// For loop to set button images  
for (UIView *subview in [self.view subviews])  // Loop through all subviews  
{  
  // Look for the tagged buttons, only the 8 tagged buttons & within array bounds
  if((subview.tag >= 1) && (subview.tag <= 8) && (subview.tag < totalBundles))
  {
    // Retrieve item in array at position matching button tag (array is 0 indexed)
    NSDictionary *bundlesDataItem = [bundlesDataSource objectAtIndex:(subview.tag - 1)];

    // Set button background to thumbnail of current bundle
    NSString *picAddress = [NSString stringWithFormat:@"http://some.thing.com/data/images/%@/%@", [bundlesDataItem objectForKey:@"Nr"], [bundlesDataItem objectForKey:@"Thumb"]];
    NSURL *picURL = [NSURL URLWithString:picAddress];
    NSData *picData = [NSData dataWithContentsOfURL:picURL];
    // Warning is generated here
    [subview setBackgroundImage:[UIImage imageWithData:picData] forState:UIControlStateNormal];
  }
}

Ответы [ 2 ]

0 голосов
/ 23 апреля 2010

Опасный фрагмент кода с таким количеством предположений, но ... сначала вы должны проверить класс UIView перед отправкой ему сообщения setBackgroundImage, а затем просто приведите свой UIView для удаления предупреждения:

if ([subview class] == [UIButton class]) {
    [((UIButton *)subview) setBackgroundImage:[UIImage imageWithData:picData] forState:UIControlStateNormal];
}
0 голосов
/ 23 апреля 2010

Вы можете сделать это:

for (id subview in [self.view subviews])

Так что тип id остановит любую проверку типа ... или проверит, отвечает ли объект на селектор и вызовет его так:

if ([subview respondsToSelector:@selector(setBackgroundImage:forState:)]) {
    [subview performSelector:@selector(setBackgroundImage:forState:)
                  withObject:[UIImage imageWithData:picData]
                  withObject:UIControlStateNormal];
}

Обратите внимание, что я запрограммировал эту последнюю часть из памяти.

...