#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.
Вывод приведенного выше примера кода выглядит следующим образом:
Комментарии:
1. Спасибо, я разместил
cellForRowAtIndexPath
2. С этим кодом — он также не показывает таблицу 🙁
3. Отображается ли табличное представление при использовании кнопки Иерархия представлений отладки в качестве экрана, показанного в ответе?
4. Нет — с иерархией представлений отладки он также не отображается
5. Вы создаете новый проект и вставляете этот код в созданный по умолчанию ViewController или пытаетесь вставить его в существующий проект. Если вы делаете последнее, я бы рекомендовал попробовать сделать первое, чтобы убедиться, что это работает для вас. Если это так, то вам, возможно, придется подробнее изучить настройки вашего собственного проекта.
Ответ №2:
Хорошо, так что, похоже, в моем коде по какой-то причине ViewWillAppear
не вызывался, поэтому при переключении на ViewDidLoad
tableview появился. Спасибо вам всем, кто помог.
Комментарии:
1. Поскольку вы говорите, что добавляли представление таблицы в иерархию, наиболее вероятная причина, по которой строки не заполнялись, заключается в том, что, если вы добавляете представление таблицы
viewWillAppear
, вам также нужно позвонить.reloadData()
. Но подходящее место для всего этого-вviewDidLoad
2. Это имеет смысл @DonMag