2014-11-20 2 views
0

Я ищу лучший способ установить изображения на все мои кнопки. Прямо сейчас я использую цикл for, но каждый раз вызываю каждую кнопку. Это уродливо и слишком долго.IOS Вызов UIButton из строковой переменной

@property (weak, nonatomic) IBOutlet UIButton *box0; 
@property (weak, nonatomic) IBOutlet UIButton *box1; 
// up to 150 of them on the page 
@property (weak, nonatomic) IBOutlet UIButton *box150; 

@end 

@implementation HelpTwo 
{ 
    bool checked0; 
    bool checked1; 
    bool checked2; 
    bool checked3; 
} 

и часть в вопросе

NSArray *boxes = [draftboxeschecked componentsSeparatedByString:@","]; 
    // pulled from DB and as an example could be 0,1,8,19,29 

NSInteger i; 
for (i=0; i < boxes.count; i++) { 
    NSString *box = boxes[i]; 
    if ([box isEqualToString:@"0"]) { 
     [_box0 setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal]; 
     checked0 = YES; 
    } else if ([box isEqualToString:@"1"]) { 
     [_box1 setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal]; 
     checked1 = YES; 
    } 
    else if ([box isEqualToString:@"2"]) { 
     [_box2 setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal]; 
     checked2 = YES; 
    } 
    else if ([box isEqualToString:@"3"]) { 
     [_box3 setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal]; 
     checked3 = YES; 
    } 

// all the way to 150 

То, что я пытаюсь сделать, но вместо этого он не работает

NSArray *boxes = [draftboxeschecked componentsSeparatedByString:@","]; 

for (NSString *boxNumber in boxes) { 

    NSString *modifiedBox = [NSString stringWithFormat:@"_box%@",boxNumber]; 
    bool check = [NSString stringWithFormat:@"checked%@",boxNumber]; 

    [modifiedBox setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal]; 
    check = YES; 
} 

EDIT:

Это похоже на работу с изображением. Еще нужно добавить логическое значение. Я добавил все кнопки в IBOutletCollection и установил номера тегов для каждого. Коллекция называется buttonCollection.

NSArray *boxes = [draftboxeschecked componentsSeparatedByString:@","]; 

for (NSString *boxNumber in boxes) { 

    for (UIButton *button in _buttonCollection) { 
     if (button.tag == boxNumber.intValue) { 
      // set image 
      [button setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal]; 
     } 
    } 


} 
+0

Есть несколько проблем в вашем коде: 1. modifiedBox является NSString. NSString не поддерживает setImage 2. Вы создаете свои локальные переменные в цикле, вы должны сделать это за пределами 3. проверьте, является ли bool, но вы назначаете ему NSString 4. проверка ничего не делает Слишком много проблем в коде , Возможно, вы можете опубликовать больше кода, чтобы он дал понять, или вы лучше описываете, что вы пытаетесь достичь. – dogsgod

+0

У вас есть 150 кнопок на IB? решением было бы использовать тег, а затем получить соответствующую кнопку на основе тега. Рассматривали ли вы использование UITableView с встроенной кнопкой. Это не эффективный способ создания 150 кнопок в uiviewcontroller. – Vig

+0

Увисеконтроллер имеет 150 кнопок, которые действуют как флажки при нажатии. Они предназначены для выбора опций на этой странице. Часть, над которой я работаю, заключается в том, что если они сохраняют «черновик» и хотят вернуться позже, я устанавливаю правильное изображение (отмечено или не проверено). Логическое значение для segue должно знать, какие поля были отмечены, чтобы они могли быть добавлены в массив – JeffK

ответ

-1

Не знаете, что вы используете checked_ # for. Вот решение (но я не рекомендую его обязательно). Я не уверен, что вы пытаетесь сделать с проверкой bool, так что я ее оставил.

NSArray *boxes = [draftboxeschecked componentsSeparatedByString:@","]; 
for (NSString *boxNumber in boxes) { 
    NSString *boxSelectorString = [NSString stringWithFormat:@"box%@", boxNumber]; 
    // Assuming the properties are on the self object, they should create selectors that 
    // match the property name. 
    // Note: I'm not familiar with IBOutlets. 
    UIButton *boxButton = [self performSelector:NSSelectorFromString(boxSelectorString)]; 
    [boxButton setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal]; 
} 
+0

Благодарим вас за помощь. Я собирался попробовать это, но кнопки уже установлены. Мне просто нужно обратиться к ним. Это для предварительной загрузки изображения, основываясь на том, был ли он ранее «проверен», и это является причиной для булевых. – JeffK

+0

Это не создает новые кнопки, просто открывает те, которые уже существуют как свойства HelpTwo. Вы можете добавить массив буферов NSNumber, если вы хотите отслеживать каждую проверенную кнопку или использовать NSMutableDictionary –

Смежные вопросы