2016-07-29 3 views
0

Я работаю над проектом iOS. Я создал UITableView для отображения списка беспилотных самолетов. Все работает нормально, но я заметил, что есть ошибка, когда я нажимаю на ячейку, чтобы отобразить детали гудения. Как вы можете видеть на изображениях ниже.Ошибка с UITableViewCell ios

Когда Tableview получить loded

enter image description here

При нажатии на ячейку

enter image description here

и этот мой код, когда я выбираю ячейку:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *_storyboardName = @"Main"; 
    UIStoryboard *_storyboard = [UIStoryboard storyboardWithName:_storyboardName bundle: nil]; 
    DroneDetailsViewController *detailsVC = [_storyboard instantiateViewControllerWithIdentifier:@"DroneDetailsViewController"]; 
    detailsVC.droneObj = [drones objectAtIndex:indexPath.row]; 
    [self.navigationController pushViewController:detailsVC animated:YES]; 
    [detailsVC.navigationController setNavigationBarHidden:NO animated:YES]; 
} 

Это мой код для cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"drone"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
    } 
    DroneObject *droneObjDisplay = nil; 
    droneObjDisplay = [drones objectAtIndex:indexPath.row]; 
    NSData *data = [[NSData alloc]initWithBase64EncodedString:droneObjDisplay.modelMSide options:NSDataBase64DecodingIgnoreUnknownCharacters]; 
    [self initCellWithComponents:cell :data :droneObjDisplay.modelName :droneObjDisplay.modelNumber]; 
    return cell; 
} 

и это в initCelWithComponents:

- (void)initCellWithComponents :(UITableViewCell *)cell :(NSData *)dataImage :(NSString *)title :(NSString *)subTitle { 

    UIView *viewCell = [[UIView alloc] initWithFrame:CGRectMake(VIEW_MARGIN, VIEW_MARGIN, widthtScreen-20, VIEW_IMAGE_HEIGHT)]; 
    viewCell.layer.borderColor = [UIColor colorWithHexString:NSLocalizedString(@"border_color", nil)].CGColor; 
    viewCell.backgroundColor = [UIColor whiteColor]; 
    viewCell.layer.borderWidth = 0.5f; 

    UIImageView *image = [[UIImageView alloc]initWithFrame:CGRectMake(VIEW_MARGIN,VIEW_MARGIN, VIEW_IMAGE_HEIGHT-(2*VIEW_MARGIN),VIEW_IMAGE_HEIGHT-(2*VIEW_MARGIN))]; 
    image.image=[UIImage imageWithData:dataImage]; 
    [viewCell addSubview:image]; 

    UILabel *titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(image.frame.size.width+2*VIEW_MARGIN, VIEW_MARGIN, viewCell.frame.size.width-(VIEW_IMAGE_HEIGHT-(4*VIEW_MARGIN)), 21)]; 
    titleLabel.text = title; 
    titleLabel.textColor = [UIColor blackColor]; 
    [titleLabel setFont:[UIFont systemFontOfSize:15]]; 
    [viewCell addSubview:titleLabel]; 

    UILabel *subTitleLabel = [[UILabel alloc]initWithFrame:CGRectMake(image.frame.size.width+2*VIEW_MARGIN, 3*VIEW_MARGIN, viewCell.frame.size.width-(VIEW_IMAGE_HEIGHT-(4*VIEW_MARGIN)), 21)]; 
    subTitleLabel.text = subTitle; 
    subTitleLabel.textColor = [UIColor blackColor]; 
    [subTitleLabel setFont:[UIFont systemFontOfSize:13]]; 
    [viewCell addSubview:subTitleLabel]; 

    cell.contentView.backgroundColor = [UIColor colorWithHexString:NSLocalizedString(@"gray_background", nil)]; 
    [cell.contentView addSubview:viewCell]; 
} 

любые идеи, как исправить это?!

+0

Попробовать комментарий didSelectRowAtIndexPath код и затем выбрать ячейку , Обновите меня, что произойдет. –

+0

Вы не можете перейти к detailVC? – Lion

+0

@SharmaVishal Я прокомментировал это, когда я выбираю ячейку, нет ошибки, это нормально, но, конечно, она не переходила к detailVC –

ответ

0

Хорошо, наконец, получив ответы на ваши вопросы, я создал пользовательскую ячейку подкласса UITableViewCell, и я добавил все мои компоненты там. Основная проблема заключалась в том, как я буду называть его без UI (раскадровки или xib) только по коду. Таким образом, после создания пользовательской ячейки я добавил эту строку в моей viewdidload:

[self.tableView registerClass:[CustomCellTableViewCell class] forCellReuseIdentifier:@"CustomCellTableViewCell"]; 

затем в cellForRowAtIndexPath я просто добавил Обычай Cell:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    DroneObject *droneObjDisplay = nil; 
    droneObjDisplay = [drones objectAtIndex:indexPath.row]; 
    static NSString *identifier = @"CustomCellTableViewCell"; 
    CustomCellTableViewCell *cell = (CustomCellTableViewCell *)[tableView dequeueReusableCellWithIdentifier:identifier]; 
    NSData *data = [[NSData alloc]initWithBase64EncodedString:droneObjDisplay.modelMSide options:NSDataBase64DecodingIgnoreUnknownCharacters]; 
    cell.image.image = [UIImage imageWithData:data]; 
    cell.titleLabel.text = droneObjDisplay.modelName; 
    cell.subTitleLabel.text = droneObjDisplay.modelNumber; 
    return cell; 
} 
1

Тип вашей ячейки: UITableViewCellStyleSubtitle, а также вы также указываете название и подпись субтитров вручную.

Если вы используете стиль ячейки, как UITableViewCellStyleSubtitle, то вы можете напрямую использовать

cell.textLabel.text = @"your title label's text"; 
cell.detailTextLabel.text = @"your detail label's text"; 

Если вы добавите еще один ярлык, то он будет создает дубликат !!!!

+0

, но я не использую textLabel ячейки по умолчанию. Я создал новую метку , что я понимаю, что мне нужно создать пользовательскую ячейку для этого?? –

+0

Да, если вы хотите добавить пользовательские объекты, тогда вы должны использовать пользовательскую ячейку. в том, что вы должны добавить каждый компонент. Если вы используете 'subtitle', то определенно будет два ярлыка! – Lion

0

Поскольку вы инициализируете UIView и UILabel в методе внутри cellForRowAtIndexPath и добавляете их как subview, эти элементы управления добавляются в вашу ячейку каждый раз, когда ячейка перезагружается. Ниже код идентифицирует каждую ячейку с уникальным идентификатором и загружает ячейку только в том случае, если эта конкретная ячейка недоступна в UITableView.
Я написал droneObjDisplay.droneId, чтобы однозначно идентифицировать ячейку, вы можете написать что-нибудь для droneObjDisplay .__, что является уникальным идентификатором вашего объекта.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    DroneObject *droneObjDisplay = nil; 
    droneObjDisplay = [drones objectAtIndex:indexPath.row]; 
    NSString *CellIdentifier = [NSString stringWithFormat:@"drone_%d", droneObjDisplay.droneId]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    NSData *data = [[NSData alloc]initWithBase64EncodedString:droneObjDisplay.modelMSide options:NSDataBase64DecodingIgnoreUnknownCharacters]; 
    [self initCellWithComponents:cell :data :droneObjDisplay.modelName :droneObjDisplay.modelNumber]; 
    } 
    return cell; 
} 

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

+0

Спасибо за ваш ответ. но ошибка все еще здесь, когда вы выбираете ячейку http://imgur.com/a/v6Bc6 –

0

TableViewCell может быть разработан и использован либо одним из следующих способов,

  1. Если вы используете раскадровку, то вы можете просто дизайн ячейки прототипа на TableView на раскадровке сам, а затем давая идентификатор ячейке. Если вы используете этот способ затем добавить компонент только на раскадровке и дать тег для каждого компонента доступа к ней в коде, если вы не подклассов UITableViewCell, и из очереди ячейки, как показано ниже,

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    UILabel *labelValue = (UILabel*) [cell viewWithTag:10]; 
    
  2. Design TableViewCell на раскадровке, как вы это делали одним способом, а затем просто создайте подкласс класса UITableViewCell и установите этот класс как пользовательский класс ячейки, выбрав ячейку в раскадровке, таким образом вы можете создать выход каждого компонента в ячейку, и вам не нужно обращаться к компоненту с помощью тегов.Ниже приведен код из очереди в клетку,

    CellSubClassed *cell = (CellSubClassed*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    cell.labelXYZ.text = arrayDataSource[indexPath.row][@"key"]; 
    
  3. Это был введен старый путь, прежде чем раскадровку, создать подкласс UITableView ячейки и создать XIb файл с таким же именем, которое вы даете UITableViewCell подкласса, создать выходы компонента, к которому вы хотите получить доступ. Ниже приведен код из очереди ячейки,

    NSArray *nib; 
    static NSString *strNibName = @"CustomCell"; 
    
    nib = [[NSBundle mainBundle] loadNibNamed:strNibName owner:self options:nil]; 
    
    CustomCell *cell = [nib objectAtIndex:0]; 
    cell.imageView.image = arrayDataSource[indexPath.row]; 
    
  4. Последний способ использует клетки Tableview по умолчанию, просто создать Tableview на раскадровке/XIb и из очереди ячейки, как показано ниже,

    static NSString *cellIdentifier = @"cell"; 
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier]; 
    
    if (cell == nil) { 
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
    } 
    
    cell.textLabel.text = @"xyz"; 
    

По умолчанию стили Tableview клеточные,

  • UITableViewCellStyleDefault
  • UITableViewCellStyleSubtitle
  • UITableViewCellStyleValue1
  • UITableViewCellStyleValue2

Вы можете прочитать больше о компании Apple для разработчиков документации here.

Итак, в вашем случае вы смешиваете два способа удаления ячейки, если вы хотите добавить компонент вручную, как и вы, и вы не хотите создавать компонент на раскадровке или Xib, тогда вы просто создаете подкласс ячейки UITableView, а затем создайте компонент в методе awakeFromNib и деактивируйте ячейку, как объяснено тремя способами.

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

+0

Большое спасибо за объяснение. Таким образом, нет возможности проектировать ячейку только по коду без использования раскадровки или Xib только по коду –

+0

Да, конечно, вы можете проектировать ячейку только по коду. Для этого выполните шаги, которые добавят tableView в раскадровку, добавьте туда одну ячейку и дайте ей идентификатор, а затем деактивируйте ячейку, как объяснено в моем ответе одним способом, а затем в cellForRowAtIndexPath вызовите ваш метод initCellWithComponent. Не добавляйте компонент в раскадровку. –

+0

да, но я имел в виду, не добавляя вид таблицы в раскадровку. –

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