Пользовательский UITableView не отображается на iPhone или iPad

#ios #objective-c

Вопрос:

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

 -(void) viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        myCustomTableView=[[UITableView alloc] initWithFrame:CGRectMake(300, 180, 236, 672) style:UITableViewStylePlain];
    else {
        myCustomTableView=[[UITableView alloc] initWithFrame:CGRectMake(113, 100, 196, 372) style:UITableViewStyleGrouped];
    }
    [myCustomTableView setDelegate:self];
    [myCustomTableView setDataSource:self];
    [myCustomTableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
    [myCustomTableView setSeparatorColor:[UIColor whiteColor]];
    myCustomTableView.opaque = NO;
    myCustomTableView.clipsToBounds = YES;
    myCustomTableView.layer.cornerRadius=8.0;
    [myCustomTableView setBackgroundColor:[UIColor blueColor]];
[self.view addSubview:myCustomTableView];
 

Это работало в более старых версиях iOS (возможно, iOS 10.0 и ниже

Добавлено дополнительное кодирование здесь;

 -(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *cellIndentifer=@"Cell";
    
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIndentifer];
    if (cell == nil) {
        //cell=[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIndentifer] autorelease];
        NSLog(@" gell is allocating");
        cell =
        [[[UITableViewCell alloc]
          initWithFrame:CGRectZero
          reuseIdentifier:cellIndentifer]
         autorelease];
        
        UIImageView *cellImageView = [[UIImageView alloc]initWithFrame:CGRectMake(4, 4, 35, 47)];
        cellImageView.tag = leftImageViewTag;
        [cellImageView setContentMode:UIViewContentModeScaleToFill];
        [cell.contentView addSubview:cellImageView];
        [cellImageView release];
        
        
        UIImageView *cellImageViewSubView = [[UIImageView alloc]initWithFrame:CGRectMake(13, 12,18 , 24)];
        cellImageViewSubView.tag = leftImageSubViewTag;
        [cellImageViewSubView setContentMode:UIViewContentModeScaleToFill];
        //[cellImageViewSubView setImage:[UIImage imageNamed:@"sp4.png"]];
        [cell.contentView addSubview:cellImageViewSubView];
        [cellImageViewSubView release];
        
        
        UIButton *myAddButton=[UIButton buttonWithType:UIButtonTypeCustom];
        [myAddButton setFrame:CGRectMake(5, 10, 40, 40)];
        [myAddButton setTag:leftAddButtonTag];
        [myAddButton setHidden:YES];
        if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) {
            [myAddButton setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"add@2x" ofType:@"png"]] forState:UIControlStateNormal];

        }
        else {
            [myAddButton setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"add" ofType:@"png"]] forState:UIControlStateNormal];

        }

        [myAddButton addTarget:self action:@selector(addCellForCamera) forControlEvents:UIControlEventTouchUpInside];
        [myAddButton setTitle:@"" forState:UIControlStateNormal];
        [cell.contentView addSubview:myAddButton];
        
        UIButton *myMinusButton=[UIButton buttonWithType:UIButtonTypeCustom];
        [myMinusButton setFrame:CGRectMake(140, 10, 40, 40)];
        [myMinusButton setTag:rightMinusButtonTag];
        if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) {
            [myMinusButton setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"minus@2x" ofType:@"png"]] forState:UIControlStateNormal];
            
        }
        else {
            [myMinusButton setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"minus" ofType:@"png"]] forState:UIControlStateNormal];
            
        }
        [myMinusButton setHidden:YES];
        [myMinusButton addTarget:self action:@selector(minusCellForCamera:) forControlEvents:UIControlEventTouchUpInside];
        [cell.contentView addSubview:myMinusButton];
        
        CameraButton *myCameraButton=[CameraButton buttonWithType:UIButtonTypeCustom];
        [myCameraButton setFrame:CGRectMake(135, 10, 50, 30)];
        [myCameraButton setTag:myCameraButtonTag];
        [myCameraButton setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"theme_Camera" ofType:@"png"]] forState:UIControlStateNormal];
        [myCameraButton setHidden:YES];
        [myCameraButton addTarget:self action:@selector(CellForCameraButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
        [myCameraButton setIndexpath:indexPath];
        [cell.contentView addSubview:myCameraButton];               
        
        
        UIImageView *cellImageView2 = [[UIImageView alloc]initWithFrame:CGRectMake(150, 4, 25, 25)];
        cellImageView2.tag = tickImageViewTag;
        [cellImageView2 setHidden:YES];
        [cellImageView2 setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"click" ofType:@"png"]]];
        [cellImageView2 setContentMode:UIViewContentModeCenter];
        [cell.contentView addSubview:cellImageView2];
        [cellImageView2 release];
        
        
        UILabel *mylabel=[[UILabel alloc] initWithFrame:CGRectMake(60, 5, 130, 30)];
        mylabel.tag=middleLabelTag;
        [mylabel setBackgroundColor:[UIColor clearColor]];
        mylabel.textColor=[UIColor whiteColor];
        
        [cell addSubview:mylabel];
        [mylabel release];
        cell.backgroundView =
        [[[UIImageView alloc] init] autorelease];
        
        
        
        UIImageView *backgroundSelection=[[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"grey-hover" ofType:@"png"]]];
        cell.selectedBackgroundView=[backgroundSelection autorelease];
        
        
        
    }
    
    [(CameraButton *)[cell viewWithTag:myCameraButtonTag] setIndexpath:indexPath];
    UIImage *rowBackground;
    
    NSInteger sectionRows = [tableView numberOfRowsInSection:[indexPath section]];
    NSInteger row = [indexPath row];
    
    if (row == 0)
    {
        rowBackground = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"top-row" ofType:@"png"]];
        
    }
    else if (row == sectionRows - 1)
    {
        
        rowBackground = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"btm-row" ofType:@"png"]];
        
        
    }
    else
    {
        rowBackground = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"row" ofType:@"png"]];
        
        
    }
    ((UIImageView *)cell.backgroundView).image = rowBackground;
    
    if (self.tickCurrentPath == indexPath) {
        [[cell viewWithTag:tickImageViewTag] setHidden:NO];
    }
    else {
        [[cell viewWithTag:tickImageViewTag] setHidden:YES];
    }
    
    cell.selectionStyle=UITableViewCellSelectionStyleNone;

    
    if (indexPath.section == 0) {
        if (indexPath.row == [customArray count] ) {
            cell.selectionStyle=UITableViewCellSelectionStyleNone;
            [[cell viewWithTag:myCameraButtonTag] setHidden:YES];
            [[cell viewWithTag:leftAddButtonTag] setHidden:NO];
            [[cell viewWithTag:rightMinusButtonTag] setHidden:NO];
            [[cell viewWithTag:leftImageViewTag] setHidden:YES];
            [[cell viewWithTag:tickImageViewTag] setHidden:YES];
            
            [[cell viewWithTag:leftImageSubViewTag] setHidden:YES];
            
            if ([customArray count]==0) {
                UIButton *button=(UIButton *)[cell viewWithTag:rightMinusButtonTag];
                [button setEnabled:NO];         }
            else {
                UIButton *button=(UIButton *)[cell viewWithTag:rightMinusButtonTag];
                [button setEnabled:YES];
            }
            
            UILabel *middleText=(UILabel *)[cell viewWithTag:middleLabelTag];
            middleText.text=@"";
        }
        else {
            [[cell viewWithTag:myCameraButtonTag] setHidden:NO];
            
            [[cell viewWithTag:leftImageViewTag] setHidden:NO];
            [[cell viewWithTag:leftAddButtonTag] setHidden:YES];
            [[cell viewWithTag:rightMinusButtonTag] setHidden:YES];
            
            //batter-sm-blnk.png
            UIImageView *batteryImageView=(UIImageView *)[cell viewWithTag:leftImageViewTag];
            [batteryImageView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"batter-sm-blnk" ofType:@"png"]]];
            
            UILabel *middleText=(UILabel *)[cell viewWithTag:middleLabelTag];
            NSDictionary *tempDict=[customArray objectAtIndex:indexPath.row];
            //  NSLog(@"tempdict contains %@",customArray);
            middleText.text=[tempDict objectForKey:@"Cell_Text"];
            
            NSData *imageData=[tempDict objectForKey:@"Image"];
            
            NSLog(@"size of image:  %d",[imageData length]);
            if ([imageData length]>1) {
                [[cell viewWithTag:leftImageSubViewTag] setHidden:NO];
                //NSData *imageData=[tempDict objectForKey:@"Image"];
                UIImageView *batteryImageView=(UIImageView *)[cell viewWithTag:leftImageSubViewTag];
                [batteryImageView setImage:[UIImage imageWithData:imageData]];
            }else {
                [[cell viewWithTag:leftImageSubViewTag] setHidden:YES];
            }
            
            
            
            
            
        }
        return cell;
    }
    else if (indexPath.section == 1) {
        UILabel *middleText=(UILabel *)[cell viewWithTag:middleLabelTag];
        middleText.text=[colorArray objectAtIndex:indexPath.row];
        [[cell viewWithTag:myCameraButtonTag] setHidden:YES];
        [[cell viewWithTag:leftImageSubViewTag] setHidden:YES];
        
        [[cell viewWithTag:leftAddButtonTag] setHidden:YES];
        [[cell viewWithTag:rightMinusButtonTag] setHidden:YES];
        [[cell viewWithTag:leftImageViewTag] setHidden:NO];
        UIImageView *batteryImageView=(UIImageView *)[cell viewWithTag:leftImageViewTag];
        [batteryImageView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[cellImages_Battery objectAtIndex:indexPath.row] ofType:@"png"]]];
        
        return cell;
        
    }
    
    else if (indexPath.section == 2)  {
        [[cell viewWithTag:leftImageSubViewTag] setHidden:YES];
        
        [[cell viewWithTag:leftImageViewTag] setHidden:NO];
        [[cell viewWithTag:myCameraButtonTag] setHidden:YES];
        
        
        UIImageView *batteryImageView=(UIImageView *)[cell viewWithTag:leftImageViewTag];
        [batteryImageView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[flagImageArray objectAtIndex:indexPath.row] ofType:@"png"]]];
        
        
        [[cell viewWithTag:rightMinusButtonTag] setHidden:YES];
        [[cell viewWithTag:leftAddButtonTag] setHidden:YES];
        UILabel *middleText=(UILabel *)[cell viewWithTag:middleLabelTag];
        middleText.text=[flagArray objectAtIndex:indexPath.row];
        return cell;
    }
    else if (indexPath.section == 3)  {
        [[cell viewWithTag:leftImageSubViewTag] setHidden:YES];
        
        [[cell viewWithTag:leftImageViewTag] setHidden:NO];
        [[cell viewWithTag:myCameraButtonTag] setHidden:YES];
        
        
        UIImageView *batteryImageView=(UIImageView *)[cell viewWithTag:leftImageViewTag];
        [batteryImageView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[flagImageArray objectAtIndex:indexPath.row 5] ofType:@"png"]]];
        
        
        [[cell viewWithTag:rightMinusButtonTag] setHidden:YES];
        [[cell viewWithTag:leftAddButtonTag] setHidden:YES];
        UILabel *middleText=(UILabel *)[cell viewWithTag:middleLabelTag];
        middleText.text=[flagArray objectAtIndex:indexPath.row 5];
        return cell;
    }
    else if (indexPath.section == 4)  {
        [[cell viewWithTag:leftImageSubViewTag] setHidden:YES];
        
        [[cell viewWithTag:leftImageViewTag] setHidden:NO];
        [[cell viewWithTag:myCameraButtonTag] setHidden:YES];
        
        
        UIImageView *batteryImageView=(UIImageView *)[cell viewWithTag:leftImageViewTag];
        [batteryImageView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[flagImageArray objectAtIndex:indexPath.row 10] ofType:@"png"]]];
        
        
        [[cell viewWithTag:rightMinusButtonTag] setHidden:YES];
        [[cell viewWithTag:leftAddButtonTag] setHidden:YES];
        UILabel *middleText=(UILabel *)[cell viewWithTag:middleLabelTag];
        middleText.text=[flagArray objectAtIndex:indexPath.row 10];
        return cell;
    }
    else if (indexPath.section == 5)  {
        [[cell viewWithTag:leftImageSubViewTag] setHidden:YES];
        
        [[cell viewWithTag:leftImageViewTag] setHidden:NO];
        [[cell viewWithTag:myCameraButtonTag] setHidden:YES];
        
        
        UIImageView *batteryImageView=(UIImageView *)[cell viewWithTag:leftImageViewTag];
        [batteryImageView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[flagImageArray objectAtIndex:indexPath.row 15] ofType:@"png"]]];
        
        
        [[cell viewWithTag:rightMinusButtonTag] setHidden:YES];
        [[cell viewWithTag:leftAddButtonTag] setHidden:YES];
        UILabel *middleText=(UILabel *)[cell viewWithTag:middleLabelTag];
        middleText.text=[flagArray objectAtIndex:indexPath.row 15];
        return cell;
    }
    else if (indexPath.section == 6)  {
        [[cell viewWithTag:leftImageSubViewTag] setHidden:YES];
        
        [[cell viewWithTag:leftImageViewTag] setHidden:NO];
        [[cell viewWithTag:myCameraButtonTag] setHidden:YES];
        
        
        UIImageView *batteryImageView=(UIImageView *)[cell viewWithTag:leftImageViewTag];
        [batteryImageView setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[flagImageArray objectAtIndex:indexPath.row 20] ofType:@"png"]]];
        
        
        [[cell viewWithTag:rightMinusButtonTag] setHidden:YES];
        [[cell viewWithTag:leftAddButtonTag] setHidden:YES];
        UILabel *middleText=(UILabel *)[cell viewWithTag:middleLabelTag];
        middleText.text=[flagArray objectAtIndex:indexPath.row 20];
        return cell;
    }
    
    return cell;
    
    
}
 

Комментарии:

1. Сделайте небольшую отладку… являются numberOfRowsInSection и cellForRowAtIndexPath вызываются? Если вы используете иерархию представлений отладки, существует ли ваше представление таблицы? Есть ли в нем клетки? Есть ли он, но каким-то образом скрыт или расположен за кадром?

2. Вы на что-то наткнулись, кажется, это не называется

3. viewWillAppear это странное место для настройки вашего табличного представления. Если это весь ваш код, вы никогда не добавляете представление таблицы в иерархию представлений. Где твой [self.view addSubview: myCustomTableView]; ?

4. Извините, я забыл добавить это, на самом деле это прямо после последней строки выше ( я отредактировал код), так что это было там, просто не работает :/

5. Хорошо — я чувствую себя глупо, но я перешел на viewDidLoad, и это работает….! Большое вам спасибо, ДонМаг

Ответ №1:

Как упоминал ДонМаг в комментариях, как минимум вам необходимо включить два метода numberOfRowsInSection UITableViewDataSource и cellForRowAtIndexPath для любых ячеек, которые будут отображаться для tableview.

Вы добавляете myCustomTableView в иерархию представлений каким-то образом где-то еще в своем коде (т. Е. self.view addSubview:)?

Вот очень простой пример использования вашего кода в качестве основы для программного создания тестового табличного представления:

 #import "ViewController.h"

@interface ViewController () <UITableViewDelegate, UITableViewDataSource>
@property (strong, nullable) UITableView *myCustomTableView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        self.myCustomTableView=[[UITableView alloc] initWithFrame:CGRectMake(300, 180, 236, 672) style:UITableViewStylePlain];
    } else {
        self.myCustomTableView=[[UITableView alloc] initWithFrame:CGRectMake(113, 100, 196, 372) style:UITableViewStyleGrouped];
    }
    [self.myCustomTableView setDelegate:self];
    [self.myCustomTableView setDataSource:self];
    [self.myCustomTableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
    [self.myCustomTableView setSeparatorColor:[UIColor whiteColor]];
    self.myCustomTableView.opaque = NO;
    self.myCustomTableView.clipsToBounds = YES;
    self.myCustomTableView.layer.cornerRadius=8.0;
    [self.myCustomTableView setBackgroundColor:[UIColor blueColor]];
    [self.view addSubview:self.myCustomTableView];
}


- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Test"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] init];
    }
    cell.textLabel.text = [NSString stringWithFormat:@"Section: %li, Row: %li", indexPath.section, indexPath.row];
    return cell;
}

- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 10;
}



@end
 

Я подозреваю, что ваш tableview никогда не добавляется в иерархию представлений, вы можете использовать «Иерархию представлений отладки» во время запуска приложения, чтобы узнать, какие представления находятся в иерархии представлений. Кнопка для этого находится справа вверху области отладки, которая находится в нижней части окна Xcode.Кнопка Отладка Иерархии просмотра

Вывод приведенного выше примера кода выглядит следующим образом:

Пример просмотра таблиц на симуляторе iPhone

Комментарии:

1. Спасибо, я разместил cellForRowAtIndexPath

2. С этим кодом — он также не показывает таблицу 🙁

3. Отображается ли табличное представление при использовании кнопки Иерархия представлений отладки в качестве экрана, показанного в ответе?

4. Нет — с иерархией представлений отладки он также не отображается

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

Ответ №2:

Хорошо, так что, похоже, в моем коде по какой-то причине ViewWillAppear не вызывался, поэтому при переключении на ViewDidLoad tableview появился. Спасибо вам всем, кто помог.

Комментарии:

1. Поскольку вы говорите, что добавляли представление таблицы в иерархию, наиболее вероятная причина, по которой строки не заполнялись, заключается в том, что, если вы добавляете представление таблицы viewWillAppear , вам также нужно позвонить .reloadData() . Но подходящее место для всего этого-в viewDidLoad

2. Это имеет смысл @DonMag