我的 tableViewCells 没有创建?
Posted
技术标签:
【中文标题】我的 tableViewCells 没有创建?【英文标题】:My tableViewCells not created? 【发布时间】:2017-04-18 05:23:46 【问题描述】:我正在处理 JSON,在我的程序中首先调用了我的 tableView 委托方法,然后我成功地从服务器获取数据,但我想根据我们从服务器获得的记录数在 tableView 中创建行。怎么样?
我的代码是.....
- (void)viewDidLoad
[super viewDidLoad];
self.displayDataTableView.delegate = self;
self.displayDataTableView.dataSource = self;
self.dateArray = [[NSMutableArray alloc]init];
self.amountArray = [[NSMutableArray alloc]init];
self.urlSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
self.urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"My host name"]];
self.dataTask = [self.urlSession dataTaskWithRequest:self.urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
NSMutableDictionary *serverRes = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
// NSLog(@"...%@ ", serverRes);
self.integer = [[serverRes objectForKey:@"Data"] count];
NSLog(@"************* = %lu", self.integer);
for (int i=0; i<self.integer; i++)
[self.dateArray addObject:[[[serverRes objectForKey:@"Data"] objectAtIndex:i] objectForKey:@"Date"]];
[self.amountArray addObject:[[[serverRes objectForKey:@"Data"] objectAtIndex:i] objectForKey:@"TotalAmount"]];
NSLog(@"Date Array : %@", self.dateArray);
];
[self.dataTask resume];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return self.integer;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
if(indexPath.row == 0)
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"detailsCell" forIndexPath:indexPath];
return cell;
else
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"detailsTitle" forIndexPath:indexPath];
return cell;
谁能帮帮我.....
【问题讨论】:
获得数据后,只需重新加载 mainQueue 中的 tableView。 【参考方案1】:您需要检查空单元格并使用相同的标识符创建新单元格
if(indexPath.row == 0)
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"detailsCell" forIndexPath:indexPath];
if (!cell)
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"detailsCell"];
return cell;
else
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"detailsTitle" forIndexPath:indexPath];
if (!cell)
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"detailsTitle"];
return cell;
或者在从服务器获取数据时重新加载tableview
self.integer = [[serverRes objectForKey:@"Data"] count];
NSLog(@"************* = %lu", self.integer);
for (int i=0; i<self.integer; i++)
[self.dateArray addObject:[[[serverRes objectForKey:@"Data"] objectAtIndex:i] objectForKey:@"Date"]];
[self.amountArray addObject:[[[serverRes objectForKey:@"Data"] objectAtIndex:i] objectForKey:@"TotalAmount"]];
[tblview reloadData];
【讨论】:
不,它没有创建任何单元格。 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section return self.integer; 我正在传递 return self.integer;这个,但是调用上面的委托方法后可以得到self.integer值。 现在尝试另一个答案 这是另一个问题。您需要检查您的互联网连接和服务器端代码。【参考方案2】:UITableView
在登陆该视图时已经创建,因此您需要在从服务器获取结果后重新加载 UITableView
。
self.integer = [[serverRes objectForKey:@"Data"] count];
NSLog(@"************* = %lu", self.integer);
dispatch_async(dispatch_get_main_queue(), ^
[self.displayDataTableView reloadData];
);
这对我来说是正确的解决方案....
【讨论】:
兄弟它已成功重新加载.. 但是创建单元格需要一些时间,我正在立即从服务器获取数据... 它在控制台上显示此消息...在从主线程访问引擎后,此应用程序正在从后台线程修改自动布局引擎。这可能导致引擎损坏和奇怪的崩溃。堆栈:( ` if (!cell) \\code \\ ` 使用它来创建单元格。dispatch_async(dispatch_get_main_queue()) // Do stuff to UI
在其中添加您的服务器调用以跳出主线程以调用 reloadData【参考方案3】:
使用这个。
- (void)viewDidLoad
[super viewDidLoad];
self.displayDataTableView.delegate = self;
self.displayDataTableView.dataSource = self;
self.dateArray = [[NSMutableArray alloc]init];
self.amountArray = [[NSMutableArray alloc]init];
self.urlSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
self.urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"API Name"]];
self.dataTask = [self.urlSession dataTaskWithRequest:self.urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
NSMutableDictionary *serverRes = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
// NSLog(@"...%@ ", serverRes);
self.integer = [[serverRes objectForKey:@"Data"] count];
NSLog(@"************* = %lu", self.integer);
for (int i=0; i<self.integer; i++)
[self.dateArray addObject:[[[serverRes objectForKey:@"Data"] objectAtIndex:i] objectForKey:@"Date"]];
[self.amountArray addObject:[[[serverRes objectForKey:@"Data"] objectAtIndex:i] objectForKey:@"TotalAmount"]];
NSLog(@"Date Array : %@", self.dateArray);
dispatch_async(dispatch_get_main_queue(), ^
[self.displayDataTableView reloadData];
);
];
[self.dataTask resume];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return self.integer;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
if(indexPath.row == 0)
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"detailsCell" forIndexPath:indexPath];
return cell;
else
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"detailsTitle" forIndexPath:indexPath];
return cell;
【讨论】:
以上是关于我的 tableViewCells 没有创建?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Plist 创建带有字幕的 TableViewCell
View Controller Nav 中的 iOS Refresh 按钮:单击时重新加载从解析的 JSON 创建的所有 tableViewCell