2013-09-05 2 views
0

Я создаю небольшую игру с интерфейсом, который очень похож на 4 картинки 1 слово. Текущая настройка до сих пор выглядит следующим образом: Пользователь получает 7-буквенное слово, генерируемое случайным образом. Существует массив, который принимает 7 букв, а затем случайным образом заполнит их с другими буквами в 12 программно созданных UIButtons:Использование UiButtons, заполненное буквами, чтобы сделать слова

for (int i=0; i< buttonCount; i++) { 
    int xpositiong = x + 37; 
    x = xpositiong; 

    isSeven ++; 
    restAt7 ++; 

    NSString *stringFromInt = [NSString stringWithFormat:@"%@",[arrayForRound objectAtIndex:i]]; 

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 

    [button addTarget:self 
       action:@selector(buttonSelected:) 
    forControlEvents:UIControlEventTouchDown]; 
    [button setTitle:stringFromInt forState:UIControlStateNormal]; 
    button.titleLabel.font = [UIFont fontWithName:@"helvetica" size:19]; 
    button.tag = i+10; 
    _letterButton = button; 

    if (restAt7 == 7) { 
     x = 47; 
    } 

    if (isSeven <= 6) { 

     button.frame = CGRectMake(x,333,40,40); 
    } 
    else 
    { 
     button.frame = CGRectMake(x,370,40,40); 

    } 

    [self.view addSubview:button]; 
} 

Существует также вторая область кнопок, однако они являются статическими и представляют собой, как «слово» , Когда выбрана одна из 12 букв, она принимает метку выбранной кнопки и заполняет одну из соответствующих кнопок «слово».

-(void)buttonSelected : (UIButton *)sender 
{ 
NSLog(@"sender %i", sender.tag); 
UIButton *button = (UIButton *)[self.view viewWithTag:sender.tag]; 
button.hidden = YES; 

if ([_buttonOne.titleLabel.text isEqualToString: @" "]) { 
    // NSLog(@"button is nil"); 
    [_buttonOne setTitle:sender.titleLabel.text forState:UIControlStateNormal]; 
    [_buttonOne setTag:button.tag]; 
} 
else if ([_buttonTwo.titleLabel.text isEqualToString:@" "]) 
{ 
    [_buttonTwo setTitle:sender.titleLabel.text forState:UIControlStateNormal]; 
} 
else if ([_buttonThree.titleLabel.text isEqualToString:@" "]) 
{ 
    [_buttonThree setTitle:sender.titleLabel.text forState:UIControlStateNormal]; 
} 
else if ([_buttonFour.titleLabel.text isEqualToString:@" "]) 
{ 
    [_buttonFour setTitle:sender.titleLabel.text forState:UIControlStateNormal]; 
} 

else if ([_buttonFive.titleLabel.text isEqualToString:@" "]) 
{ 
    [_buttonFive setTitle:sender.titleLabel.text forState:UIControlStateNormal]; 
} 
else if ([_buttonSix.titleLabel.text isEqualToString:@" "]) 
{ 
    [_buttonSix setTitle:sender.titleLabel.text forState:UIControlStateNormal]; 
} 
else if ([_buttonSeven.titleLabel.text isEqualToString:@" "]) 
{ 
    [_buttonSeven setTitle:sender.titleLabel.text forState:UIControlStateNormal]; 
} 

}

Before Selection

After Selection

Правильно! Вот мой вопрос. Если пользователь решит, что выбрал неправильную букву и хочет удалить эту букву, они могут нажать одну из 7 кнопок, чтобы удалить эту букву. Однако я не знаю, как скрыть соответствующую кнопку, которая изначально была заполнена письмом ...

Я уверен, что это имеет какое-то отношение к сохранению тега выбранной кнопки, однако, поскольку каждая из 7 кнопок присвоенный тегом. Я не уверен, как это сделать.

EDIT:

Я развесить решение, которое работало. Также все функции были переписаны с помощью циклов.

-(void)buttonSelected : (UIButton *)sender 
{ 
NSLog(@"sender %i", sender.tag); 
UIButton *button = (UIButton *)[self.view viewWithTag:sender.tag]; 
button.hidden = YES; 

for (int i = 0; i < _wordButtonsArray.count; i ++) { 

    UIButton *selectedButton = [_wordButtonsArray objectAtIndex:i]; 

    if ([selectedButton.titleLabel.text isEqualToString:@" "]) { 

     [selectedButton setTitle:sender.titleLabel.text forState:UIControlStateNormal]; 
     [selectedButton setTag:button.tag]; 
     return; 
    } 
} 
    [self checkIfAnswerIsFinished:sender]; 

} 


- (IBAction)clearButton:(id)sender 
{ 
UIButton *button = (UIButton *)[self.view viewWithTag:[sender tag]]; 
button.hidden = NO; 

for (int i = 0; i < _wordButtonsArray.count; i ++) { 

    if (button == [_wordButtonsArray objectAtIndex:i]) { 

     [button setTitle:@" " forState:UIControlStateNormal]; 

     for (int letterButtonsIndex = 0; letterButtonsIndex < _letterButtonsArray.count; letterButtonsIndex++) { 

      UIButton *letterButton = [_letterButtonsArray objectAtIndex:letterButtonsIndex]; 

      if (button.tag == letterButton.tag) { 
       button.tag = i; 
      letterButton.hidden = NO; 
     } 
    } 
} 
} 
} 

Работает как очарование!

+1

Боковое примечание - узнайте об использовании массивов, чтобы вам не нужно было так много переменных и столько блоков 'if/else'. – rmaddy

+0

Thanks Maddy, Сортировка блоков if/else в 1 для цикла. –

ответ

1

Кажется, что один из способов сделать это - создать NSArray с 7 пробелами, каждый из которых заполняется либо тегом кнопки источника, либо -1. Если пользователь нажимает на -1, ничего не делайте. Если это число, установите, чтобы помеченный элемент был видимым.

Кроме того, ваш код ужасно не сух (не повторяйте сами) - вы должны потратить некоторое время на размышления о программировании и то, как лучше использовать структуры данных. Если вы хотите получить более конкретные советы, просто спросите в комментариях, и я отредактирую. :)

+0

Darn ... это было моим вторым решением: S – LuisCien

+0

Извините! Трудно сказать, сражаетесь ли вы с людьми, чтобы сделать решение. – Lugubrious

+0

Спасибо Lugubrious! Да, я знаю, что это ужасно не СУХОЙ, я получил код, написанный так же вчера утром, поэтому просто пытался разобраться с решением для селекторов кнопок. Все методы были переписаны с помощью 1 для цикла :) Еще раз спасибо –

1

Я могу придумать пару способов сделать это.

Решение 1:

Добавьте 12 кнопок (нижняя часть) к NSArray так, когда пользователь нажимает на одну из 7 кнопок (верхняя секция), вы можете перебирать этот массив и сравнить названия. Что-то вроде этого:

for (UIButton *button in buttonsArray) { 
    NSString *buttonTitle = [button titleForState:UIControlStateNormal]; 
    // I'm assuming here that you already have the touched button tile 
    if ([buttonTitle isEqualToString:touchedButtonTitle]) { 
     button.hidden = NO; 
    } 
} 

Решение 2:

Создать массив из 7 элементов, где вы можете соответствовать «слово» кнопки с метками ваших кнопок письма. Что-то вроде этого:

-(void)buttonSelected : (UIButton *)sender 
{ 
    NSLog(@"sender %i", sender.tag); 
    UIButton *button = (UIButton *)[self.view viewWithTag:sender.tag]; 
    button.hidden = YES; 

    if ([_buttonOne.titleLabel.text isEqualToString: @" "]) { 
     // NSLog(@"button is nil"); 
     [_buttonOne setTitle:sender.titleLabel.text forState:UIControlStateNormal]; 
     [_buttonOne setTag:button.tag]; 

     // you know this is object One. Insert tag at position zero (arrays are zero-based) 
     self.topButtonsArray insertObject:[NSNumber numberWithInt:sender.tag] atIndex:0]; 
    } 
. 
. 
. 

Надеюсь, это поможет!

+0

Спасибо LuisCien, теперь дайте ему вихрь, но похоже, что он будет работать. –

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