2013-12-17 1 views
0

Я новичок в разработке iPhone. В моем приложении я использую tableview.In tableview Я использую два uibuttons один в белый цвет и еще один в graycolor. Если я нажму кнопку серого цвета, он должен изменен на белый цвет, а другая кнопка должна быть заменена на серый цвет в одно и то же время.Как изменить цвет фона двух uibutton на действие одного клика в iPhone?

Это мой код:

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    ExampleCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    cell=nil; 
    if(cell == nil) 
    { 
     cell = [[ExampleCell alloc] initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:CellIdentifier]; 
    } 

    if(indexPath.row == 0) 
    { 
     postbtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
     [postbtn setFrame:CGRectMake(0, 205, 160, 34)]; 
     [postbtn setBackgroundColor:[UIColor whiteColor]]; 
     [postbtn setTitle:[NSString stringWithFormat:@"%@ POST",[AppDelegate.profileDic objectForKey:@"posts"]] forState:UIControlStateNormal]; 
     [postbtn.titleLabel setFont:[UIFont fontWithName:@"Verdana-Bold" size:10]]; 
     [postbtn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal]; 
     [postbtn setTag:1001]; 
     [postbtn addTarget:self action:@selector(reloadAction:) forControlEvents:UIControlEventTouchUpInside]; 
     [cell addSubview:postbtn]; 

     likebtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
     [likebtn setFrame:CGRectMake(160, 205, 160, 34)]; 
     [likebtn setBackgroundColor:[UIColor lightGrayColor]]; 
     [likebtn setTitle:[NSString stringWithFormat:@"%@ LIKE",[AppDelegate.profileDic objectForKey:@"likes"]] forState:UIControlStateNormal]; 
     [likebtn.titleLabel setFont:[UIFont fontWithName:@"Verdana-Bold" size:10]]; 
     [likebtn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal]; 
     [likebtn setTag:1002]; 
     [likebtn addTarget:self action:@selector(reloadAction:) forControlEvents:UIControlEventTouchUpInside]; 
     [cell addSubview:likebtn]; 
     } 
)}; 

    -(void)reloadAction:(id)sender 
    { 


     if ([sender tag] == 1001) 
     { 
      [postbtn setBackgroundColor:[UIColor whiteColor]]; 
      [likebtn setBackgroundColor:[UIColor lightGrayColor]]; 
      AppDelegate.selectedTab=1; 
      [profiletableview reloadData]; 

     } 
     if ([sender tag] == 1002) 
     { 
      [postbtn setBackgroundColor:[UIColor lightGrayColor]]; 
      [likebtn setBackgroundColor:[UIColor whiteColor]]; 
      AppDelegate.selectedTab=2; 
      [self likewebservice]; 
      [profiletableview reloadData]; 
     } 
    } 

Есть ли способ изменить цвет фона UIButton.

+2

где проблема? ваш код работает или нет? – Ilario

+0

Вам не нужно использовать тег 'if (sender == postbtn)' должен работать – KIDdAe

ответ

3

Проблема заключается в том, что вы перезагрузки таблицы сразу после того, как нажата кнопка, включив:

[profiletableview reloadData]; 

в методе reloadAction:. Поступая таким образом, вы просто возвращаете цвета тем, которые были первоначально определены в tableView:cellForRowAtIndexPath:. Выньте эту линию, и она должна работать.


Edit:

И если вам нужно, чтобы иметь возможность перезагрузить данные в таблице, вы, вероятно, не следует инициализировать UIButtons в вашем методе tableView:cellForRowAtIndexPath: (или, по крайней мере, вы не должны инициализировать UIButtons повторно после первой загрузки). Вам может быть лучше инициализировать ваши UIButtons в методе viewDidLoad, чтобы они были инициализированы до загрузки таблицы, а затем, как вы уже это сделали, добавили UIButtons в ячейку во время tableView:cellForRowAtIndexPath: и изменили цвета и значения кнопок во время reloadAction:. Я мог ошибаться, но в этом случае вам, вероятно, все равно не нужно будет перезагружать таблицу во время reloadAction:, так как вы напрямую меняете кнопки и можете также напрямую изменять названия кнопок в этом же методе; но, как правило, приятно иметь возможность перезагрузить таблицу, не путая ваши кнопки.

Edit # 2:

Кроме того, если эта строка остается неизменной, вы можете перезагрузить только нужные строки, используя reloadRowsAtIndexPaths: withRowAnimation или, как сказал KIDdAe, сделать полную таблицу перезарядку, но только добавить кнопки в ячейку если ячейка == nil.

+0

Было бы лучше сохранить какое-то состояние, на котором кнопки ячеек должны быть разных цветов. В 'reloadAction: 'обновите состояние и пусть цвет кнопки будет основан на этом состоянии в' cellForRowAtIndexPath: '. Таким образом, перезагрузка табличного представления не испортит ситуацию. – Lance

+0

На самом деле вам, вероятно, не нужно снова создавать эту кнопку каждый раз, когда вы перезагружаете свой табло. Просто обработайте этот случай в своем 'cellForRow', и вы сможете называть' reloadData' при щелчке – KIDdAe

+0

Да, я полностью согласен с этим @Lance. Просто указывая текущую проблему на его код. –

0

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

CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); 
UIGraphicsBeginImageContext(rect.size); 
CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor); 
CGContextFillRect(context, rect); 

UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

После запуска, что вы будете иметь 1x1 пиксель UIImage, то есть, в данном случае, синий. Затем вы установите это изображение в качестве фонового изображения для состояния кнопки, которое вы устанавливаете. Далее будет установить изображение для нормального (незарегистрированного) состояния кнопки:

[yourbutton setBackgroundImage:image forState:UIControlStateNormal]; 

Вы можете установить пользовательский цвет для щелкнули состояние, а также, используя различные цвета выше, а затем выполните следующие действия:

[yourbutton setBackgroundImage:image forState:UIControlStateHighlighted]; 

Вы можете поместить код для создания изображения в отдельный метод, чтобы вы просто передали ему цвет, который вы хотите, чтобы сделать изображение. Затем вы можете легко установить цвета фона многих разных кнопок на разные цвета.

+0

Это было так, но больше не было. Не нужно делать все это, чтобы изменить цвет фона. Действительно, я думаю, что решение в этом случае такое, как я написал в своем ответе. –

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