2013-09-02 4 views
6

Я собираюсь попытаться объяснить это лучшее, что я могу, так голый со мной. У меня есть восемь (8) UIButtons настроек в моей игре. Когда один выбран, он показывает, что он выбран, и если вы нажмете его снова, он будет отображаться как невыбранный. Тем не менее, я хочу сделать так, чтобы, когда вы выбираете кнопку и выбираете любую из семи (7), они становятся невыбранными.Отменить выбор всех UIButtons, когда один выбран

Я знаю, как это сделать с помощью [buttonName setSelected:NO], но проблема в том, что я не могу передать buttonOne на кнопку Two, если buttonTwo уже передан buttonOne, потому что я уже импортировал заголовочный файл buttonTwo в buttonOne. Он выдает ошибку синтаксического анализа, если у меня есть оба заголовка, импортирующих друг друга. Некоторое время я застрял на этом, и надеялся, что кто-то может решить мою проблему.

Спасибо за любую помощь.

+0

Вау, провести второй, почему на Земле вы импортировать пользовательские кнопки заголовочные файлы друг с другом? И не говорите мне, что вы создали пользовательский класс для ** каждого ** и каждого 'UIButton', который у вас есть. –

+0

Перед тем, как выбрать любую кнопку, заново создайте все кнопки –

+0

Пожалуйста, выберите ответ, если какой-либо из них вам вообще помог или предоставить более подробную информацию, чтобы узнать, можем ли мы вам помочь. Благодаря! – veducm

ответ

1

На самом деле я создал ответ, прочитав все ваши данные, которые я вам очень благодарен. Свойство тега класса UIButton было неизвестно мне до этого сообщения.

Я создал собственный подкласс UIButton, назовем его CustomUIButton.m. Я создал свойство NSMutableArray для использования при хранении кнопок, которые я назову customButtonArray.

Когда я создал кнопку, я установил свойство tag и добавил кнопку в локальный массив на родительском контроллере представления.После того, как были созданы все кнопки, которые я хотел, я поставил customButtonArray, например, так:

// Initialize buttonHolderArray 
NSMutableArray *buttonHolderArray = [[NSMutableArray alloc] init]; 

// Create a button 
CustomUIButton *newButton = [[CustomUIButton alloc] initWithFrame:CGRectMake(10, 10, 50, 30)]; 
newButton.tag = 1; 
[newButton setImage:[UIImage imageNamed:@"newButtonUnselected" forControlState:UIControlStateNormal]]; 
[buttonHolderArray addObject:newButton]; 

// Create additional buttons and add to buttonHolderArray... 
// using different numbers for their tags (i.e. 2, 3, 4, etc) 

// Set customButtonArray property by iterating through buttonHolderArray 
NSInteger buttonCount = [buttonHolderArray count]; 

for (int i = 0; i < buttonCount; i++) 
{ 
    [[buttonHolderArray objectAtIndex:i] setCustomButtonArray:buttonHolderArray]; 
} 

Чтобы отменить любую другую кнопку, выбранную, когда различные кнопки handleTap: называется, я итерация через customButtonArray в главном файле подкласса и установить selected Недвижимость NO. Я также установил правильное изображение из другого свойства массива, которое я вручную заполнил изображениями, что я сделал так, чтобы массив не приходилось заполнять каждый раз при нажатии кнопки. В конце концов, невыбранные все остальные кнопки, как так:

// Populate two arrays: one with selected button images and the other with 
// unselected button images that correspond to the buttons index in the 
// customButtonArray 
NSMutableArray *tempSelectedArray = [[NSMutableArray alloc] init]; 
[tempSelectedArray addObject:[UIImage imageNamed:@"newButtonSelected"]]; 
// Add the other selected button images... 
// Set the property array with this array 
[self setSelectedImagesArray:tempSelectedArray]; 

NSMutableArray *tempUnselectedArray = [[NSMutableArray alloc] init]; 
[tempUnselectedArray addObject:[UIImage imageNamed:@"newButtonUnselected"]]; 
// Add the other unselected button images... 
// Set the property array with this array 
[self setUnselectedImagesArray:tempUnselectedArray]; 

- (void)handleTap:(UIGestureRecognizer *)selector 
{ 
    // Get the count of buttons stored in the customButtonArray, use an if-elseif 
    // statement to check if the button is already selected or not, and iterate through 
    // the customButtonArray to find the button and set its properties 
    NSInteger buttonCount = [[self customButtonArray] count]; 

    if (self.selected == YES) 
    { 
     for (int i = 0; i < buttonCount; i++) 
     { 
      if (self.tag == i) 
      { 
       [self setSelected:NO]; 
       [self setImage:[[self unselectedImagesArray] objectAtIndex:i] forControlState:UIControlStateNormal]; 
      } 
     } 
    } 
    else if (self.selected == NO) 
    { 
     for (int i = 0; i < buttonCount; i++) 
     { 
      if (self.tag == i) 
      { 
       [self setSelected:NO]; 
       [self setImage:[[self selectedImagesArray] objectAtIndex:i] forControlState:UIControlStateNormal]; 
      } 
     } 
    } 

    for (int i = 0; i < buttonCount; i++) 
    { 
     if (self.tag != i) 
     { 
      [self setSelected:NO]; 
      [self setImage:[[self unselectedImagesArray] objectAtIndex:i] forControlState:UIControlStateNormal]; 
     } 
    } 
} 

Спасибо за всю полезную информацию, хотя, полагал, что я должен разделить окончательный ответ, который я придумал подробно, чтобы помочь кто-то еще, что приходит через эту проблему ,

0

Простейший подход здесь состоял в том, чтобы получить родителя UIView кнопки включены и проходят через него. Вот небольшой пример из моего кода:

for (UIView *tmpButton in bottomBar.subviews) 
{ 
    if ([tmpButton isKindOfClass:[UIButton class]]) 
    { 
     if (tmpButton.tag == 100800) 
     { 
      tmpButton.selected = YES; 
      [tmpButton setTitleColor:[UIColor greenColor] forState:UIControlStateNormal]; 
      [tmpButton setTitleColor:[UIColor greenColor] forState:UIControlStateHighlighted]; 

     }else{ 

      tmpButton.selected = NO; 
      [tmpButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 
      [tmpButton setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; 
     } 
    } 
} 
+0

Не было бы проще использовать «UIControlStateSelected» только при инициализации UIButtons? установка 'UIControlStateNormal' как redColor и' UIControlStateSelected' как greenColor? Таким образом, вам не нужно менять цвет кнопок каждый раз, когда пользователь прикасается к пользовательскому интерфейсу. – Vinzzz

+0

Что происходит с этим кодом, если 'bottomBar' имеет subviews, которые не являются UIButtons? – Vinzzz

+0

@ Vinzzz, что я делаю здесь, делает нажатием кнопки невидимые пользователю. Что происходит? Я предполагаю, что он не выполняется. Мы могли бы изменить 'UIButton' в' '' '' '' '' '' '' '' '', если вы хотите больше. –

12

Получить родительский вид текущей кнопки и перебирать все кнопки внутри, снимите выделение всех из них. Затем выберите текущий.

// Unselect all the buttons in the parent view 
for (UIView *button in currentButton.superview.subviews) { 
    if ([button isKindOfClass:[UIButton class]]) { 
     [(UIButton *)button setSelected:NO]; 
    } 
} 

// Set the current button as the only selected one 
[currentButton setSelected:YES]; 

Примечание: Как было предложено на комментариях, вы можете сохранить массив кнопок и перейти на него так же, как приведенный выше код делает с подобозрением родительского вида. Это улучшит производительность вашего кода, если в представлении, содержащем кнопки, есть много других подпрограмм внутри.

+1

Вы можете пропустить проверку currentButton с каждой кнопкой простым изменением порядка операций. Сначала - отмените выбор всех, чем выберите текущий. И лучше создать отдельный массив для кнопок, которые следуют за этим поведением, чем повторение всех подзонов. – ArtFeel

+0

@ArtFeel Вы правы. Мы могли бы просто отменить выбор всех кнопок и выбрать текущий. Я отредактирую ответ. Благодаря!! – veducm

+2

Это должен быть приемлемый ответ .... Измените зеленый галочку –

0

Чтобы ответить «Он бросает синтаксическую ошибку, если у меня есть и заголовки импортирующих друг друг» ...

Вы должны воздержаться от использования #import в .h файлов как можно больше, и вместо того, чтобы объявить, что вы будете желая использовать в качестве декларации вперед класса:

@class MyCustomClass 

@interface SomethingThatUsesMyCustomClass : UIViewController 

@property (nonatomic, strong) MyCustomClass *mcc; 

@end 

Затем #import заголовок в файле .m:

#import "MyCustomClass.h" 

@implementation SomethingThatUsesMyCustomClass 

-(MyCustomClass *)mcc 
{ 
    // whatever 
} 

@end 

Этот подход ПРЕД которые вызваны #import циклами.

Хотя я должен сказать, что согласен с комментарием Сергиуса в вопросе о том, что эта установка кажется немного странной.

0

Я выяснил довольно простой способ решить эту проблему. Мой пример - для 2 кнопок, но вы можете легко добавить дополнительные инструкции if для дополнительных кнопок. Подключите все кнопки к файлу .h как свойства и назовите их (я сделал button1 & button2). Поместите следующий код в свой файл .m и подключите его (через раскадровку) ко всем вашим кнопкам. Удостоверьтесь, что когда вы настраиваете кнопку, чтобы установить изображение для ОБА, нормальный UIControlStateNormal & UIControlStateSelected или эта привычная работа.

- (IBAction)selectedButton1:(id)sender { 

if ([sender isSelected]) { 
    [sender setSelected:NO]; 

    if (sender == self.button1) { 
     [self.button2 setSelected:YES]; 
    } 
    if (sender == self.button2) { 
     [self.button1 setSelected:YES]; 
    } 
} 

else 
{ 
    [sender setSelected:YES]; 

    if (sender == self.button1) { 
     [self.button2 setSelected:NO]; 
    } 
    if (sender == self.button2) { 
     [self.button1 setSelected:NO]; 
    } 

} 
0

ли вы пытаетесь использовать рамки ReactiveCocoa и добавить некоторые блоки для вашего кода, это не самый простой подход еще я бы сказал, что является наиболее эффективным, когда у вас есть несколько зависимостей и очень хорошо для масштабирования

я создал небольшой проект для решения вашей проблемы, используя мой предложенный подход (я пытался адаптировать его к старому доброму шаблону MVC вместо моего предпочтительного MVVM)

вы можете найти его здесь

https://github.com/MWaly/MWButtonExamples

забудьте установить стручки какао файл, как нам нужно «ReactiveCocoa» и «BlocksKit» для этого образца

мы будем использовать два основных класса

ViewController => Объект ViewController отображения кнопок MWCustomButton => Пользовательские UIButton, который обрабатывает события

при создании пуговицы слабой ссылки на ViewController также создается с помощью свойства

@property (weak) ViewController *ownerViewController ; 

события будут обработаны с использованием помощи метода blocksKit bk_addEventHandler и передать его в блоке ViewController (selectedButtonCallBackBlock)

[button bk_addEventHandler:^(id sender) 
    { 
     self.selectedButtonCallBackBlock(button); 

    } forControlEvents:UIControlEventTouchUpInside]; 

сейчас в ViewController для каждой кнопки Коснулся callBackButtonBlock будет trigerred, где он будет изменить его выбранную кнопку, если это применимо

__weak __typeof__(self) weakSelf = self; 

self.selectedButtonCallBackBlock=^(MWCustomButton* button){ 
    __typeof__(self) strongSelf = weakSelf; 
    strongSelf.currentSelectedButton=button; 
     }; 

в классе MWCustomButton, он будет слушать любые изменения в свойстве «currentSelectedButton» его ownerViewController и изменит свое свойство выбора в соответствии с его помощью нашей хорошей Реактивной какао

///Observing changes to the selected button 
    [[RACObserve(self, ownerViewController.currentSelectedButton) distinctUntilChanged] subscribeNext:^(MWCustomButton *x) { 
      self.selected=(self==x); 
    }]; 

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

2

Я знаю, что слишком поздно ответить на этот вопрос, но я сделал это только в небольших строках кода. Вот что я сделал:

NSArray *arrView = self.view.subviews; 
    for (UIButton *button in arrView) { 
     if ([button isKindOfClass:[UIButton class]]) { 
      [((UIButton *) button) setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
     } 
    } 
[button1 setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal]; 
2

Простой способ сделать.

-(void)buttonSelected:(id)sender{ 
    UIButton *currentButton = (UIButton *)sender; 
    for(UIView *view in self.view.subviews){ 

     if([view isKindOfClass:[UIButton class]]){ 

      UIButton *btn = (UIButton *)view; 
      [btn setSelected:NO]; 
     } 
    } 

    [currentButton setSelected:YES]; 

} 
0

Петля через все виды в виде родителя. Проверьте, является ли это UIButton (или ваш пользовательский класс кнопок), а не отправителем. Установите все представления isSelected на false. Как только цикл закончен, установите кнопку отправителя isSelected в значение true.

Swift 3 способ:

func buttonPressed(sender: UIButton) { 
    for view in view.subviews { 
     if view is UIButton && view != sender { 
      (view as! UIButton).isSelected = false 
     } 
    } 
    sender.isSelected = true 
} 
Смежные вопросы