2013-10-11 5 views
4

У меня есть UIButton в UITableViewCell, который работает правильно с iOS4, теперь, поскольку обновление iOS7 больше не работает. Это в основном изображение пустой коробки. Когда пользователь нажимает на изображение (UIButton), изображение меняется на отмеченное поле. Я НЕ использую XIB. У кого-нибудь есть предложения? Заранее спасибо.UIButton в UITableViewCell не работает в iOS7

(я уже пробовал contentView.userInteractionEnabled = NO; и [cell bringSubviewToFront:button], но это не сработало)

Вот некоторые соответствующий код:

- (UITableViewCell *)taskCell:(NSIndexPath *)indexPath table:(UITableView *)localTableView managed:(NSManagedObject *)managedTask dateFormat:(NSDateFormatter *)localDateFormatter{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [localTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 

     // Checkbox 
     UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(-4.0f, -3.0f, 48.0f, 48.0f)]; 
     button.tag=kCellButtonViewTag; 
     button.adjustsImageWhenHighlighted=NO; 
     [button setImage:[UIImage imageNamed:@"uncheckedPriorityNone.png"] forState:UIControlStateNormal]; 
     [button addTarget:self action:@selector(toggleCheckedMode:) forControlEvents:UIControlEventTouchUpInside]; 
     [cell.contentView addSubview:button]; 
     [button release]; 
     } 
} 


- (IBAction)toggleCheckedMode:(id)sender{ 

    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; 

    UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview]; 
    NSIndexPath *indexPath = [self.tableView indexPathForCell:clickedCell]; 
    Task *localTask = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

    UIButton *button = sender; 
    [button setImage:[UIImage imageNamed:@"checkedGray.png"] forState:UIControlStateNormal]; 
} 
+1

возможно дубликат [Как узнать номер строки UITableView] (http://stackoverflow.com/questions/9274494/how -to-know-the-uitableview-row-number) – jrturton

ответ

0

Я нашел такую ​​же проблему. Самое чистое решение, которое я мог придумать, позволял поддерживать pre-iOS7, а iOS7 использовал свойство editAccessoryView из UITableViewCell, а также пользовательский UIButton.

В моем случае я использую NIB, но это не должно иметь никакого значения. Так что в вашем случае будет:

// Checkbox 
    if (([[[UIDevice currentDevice] systemVersion] compare:(@"7.0") options:NSNumericSearch] != NSOrderedAscending)) { 

     UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
     button.frame = CGRectMake(-4.0f, -3.0f, 48.0f, 48.0f); 

     self.editingAccessoryView = button; 

     [self.editingAccessoryView setHidden:YES]; 
    } 
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(-4.0f, -3.0f, 48.0f, 48.0f)]; 
    button.tag=kCellButtonViewTag; 
    button.adjustsImageWhenHighlighted=NO; 
    [button setImage:[UIImage imageNamed:@"uncheckedPriorityNone.png"] forState:UIControlStateNormal]; 
    [button addTarget:self action:@selector(toggleCheckedMode:) forControlEvents:UIControlEventTouchUpInside]; 
    [cell.contentView addSubview:button]; 
    [button release]; 

Дело в том, что действие еще добавляется для пользовательских UIButton, но на iOS7, другая кнопка создается с такой же размер, устанавливается в editingAccessoryView и скрытые , Это должно сделать трюк.

запомнить setEditing: ДА в вашем UITableView.

0

Если вы хотите setEditing: ДА/НЕТ в вашем UITableView. Вы должны использовать ниже единицы, потому что иерархия tableview изменяется на ios7.

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) 

{   
    [(UITableView *)self.superview isEditing]  
} 
    else  

{  
     [(UITableView *)self.superview.superview isEditing]  
} 
2
UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview]; 

Это ваша проблема. Иерархия представлений ячеек изменилась в iOS7, и вы были пойманы в зависимости от этого. Мое решение here все еще работает в iOS7, я предлагаю вам использовать это вместо тегов или навигации по иерархии представлений.

5

Попробуйте добавить представление к самой ячейке, а не к содержимому.

Так

[cell addSubview:button]; 

Вместо

[cell.contentView addSubview:button]; 
+0

Это ответ! Зачем? –

+0

Это просто исправляет плохое решение. Никогда не зависеть от хождения по частной иерархии. – jrturton

3

У меня были проблемы с этим, и IB, кажется, не позволяют размещать взгляды за пределами contentview больше. То, как я справилась с ней, продолжая использовать IB для размещения и то, что не так:

-(void)awakeFromNib{ 
    [self addSubview:self.myButton]; 
} 
Смежные вопросы