我无法正确重新加载UITableView。我的应用程序有时会工作,有时会崩溃,因为当tableView尝试更新时,其中一个数据元素没有正确存储在数组中。有人可以指出我正确的地方重新加载我的tableView。
- (void)viewDidLoad {
[super viewDidLoad];
[self queryForNewBooks];}
-(void)queryForNewBooks{
_bookNameArray = [[NSMutableArray alloc] init];
_authorNameArray = [[NSMutableArray alloc] init];
_isbnNumberArray = [[NSMutableArray alloc] init];
_bookImageData = [[NSMutableArray alloc] init];
PFQuery *query = [PFQuery queryWithClassName:@"BooksForSale"];
[query orderByDescending:@"createdAt"];
[query findObjectsInBackgroundWithBlock:^( NSArray *objects, NSError *error) {
if (objects.count >=1) {
for (PFObject *object in objects) {
PFFile *imageFile = [object objectForKey:@"image"];
[imageFile getDataInBackgroundWithBlock:^(NSData *result, NSError *error) {
if (!error) {
NSData *data = result;
NSLog(@"HEYYYYYY");
if (data == NULL) {
}
else{
[ _bookImageData addObject:data];
//I have tried placing it here [self.tableView reloadData]
// NSLog(@"%@",[_bookImageData objectAtIndex:0]);
}
}
}
];
NSDictionary *bookNameDictionary = object[@"nameOfBook"];
NSDictionary *authorNameDictionary = object[@"Author"];
NSDictionary *bookImageDictionary = object [@"image"];
NSDictionary *isbnNumberDictionary = object [@"isbnNumber"];
NSString *objectID = [object objectId];
if (bookNameDictionary != NULL){
NSLog(@"Yo bro here is the book name %@",bookNameDictionary);
[_bookNameArray addObject:bookNameDictionary];
NSLog(@"number: %@", bookNameDictionary);
}
if (bookNameDictionary == NULL) {
[_bookNameArray addObject:@""];
NSLog(@"Blank space");
}
if (authorNameDictionary != NULL) {
[_authorNameArray addObject:authorNameDictionary];
// [_tableData addObject:ft];
NSLog(@"Author Name : %@",_authorNameArray);
// NSLog(@"the table data is %@",_tableData);
}
if (authorNameDictionary == NULL) {
[_authorNameArray addObject:@""];
NSLog(@"Blank space");
}
if (isbnNumberDictionary != NULL){
NSLog(@"Yo bro here is the isbn %@",isbnNumberDictionary);
[_isbnNumberArray addObject:isbnNumberDictionary];
NSLog(@"number: %@", isbnNumberDictionary);
//[self.tableview reloadData];
}
if (isbnNumberDictionary == NULL) {
[_isbnNumberArray addObject:@""];
NSLog(@"Blank space");
}
/* if (bookImageDictionary !=NULL){
[_bookImageData addObject:bookImageDictionary];
}
if (bookImageDictionary ==NULL){
[_bookImageData addObject:@""];
NSLog(@"Blank Space");
}*/
if (objectID != NULL) {
[_objectIDArray addObject:objectID];
NSLog(@"object id is : %@",objectID);
}
if (objectID ==NULL){
[_objectIDArray addObject:@"blank"];
}
}
}
// code
}];
//I have tried placing it here [self.tableView reloadData]
);
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.bookNameArray count];
}
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = @"TableViewCell";
TableViewCell *cell = (TableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
NSLog(@"Here are the book names, %@",_bookNameArray);
cell.bookNameLabel.text = [_bookNameArray objectAtIndex:indexPath.row];
cell.authorNameLabel.text = [_authorNameArray objectAtIndex:indexPath.row];
if ([_bookImageData objectAtIndex:indexPath.row] != NULL ) {
NSLog(@"it seems to work");
UIImage *image = [UIImage imageWithData: [_bookImageData objectAtIndex:indexPath.row]];
cell.bookImageLabel.image = image;
}
else{
NSLog(@"Error");
}
return cell;
}
更新问题: 这是宣告PFimageView的正确方法吗? 我可以在Xib文件中拖动UIImageView然后 将其类更改为PFImageView? 将其更改为PFImageView后,我是否可以像往常一样将视图链接到插座?
#import <UIKit/UIKit.h>
#import <Parse/Parse.h>
#import <ParseUI/ParseUI.h>
@interface TableViewCell : UITableViewCell
@property (nonatomic, weak) IBOutlet UILabel *bookNameLabel;
@property (nonatomic, weak) IBOutlet UILabel *authorNameLabel;
@property (nonatomic, weak) IBOutlet PFImageView *bookImageLabel;
@property (nonatomic, weak) IBOutlet UILabel *priceOfBook;
@end
#import <Parse/Parse.h>
#import "TableViewCell.h"
#import <ParseUI/ParseUI.h>
@implementation TableViewCell
@synthesize bookNameLabel =_bookNameLabel;
@synthesize authorNameLabel = _authorNameLabel;
@synthesize bookImageLabel = _bookImageLabel;
- (void)awakeFromNib {
// Initialization code
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
@end
答案 0 :(得分:0)
使代码复杂化的部分是需要使用查询返回的对象来获取图像。最简单的解决方案是省略从查询完成处理程序中获取图像。
相反,循环返回的对象,构建数组(这里也有改进的空间,但现在只是坚持你的问题的崩溃部分)。在_bookImageData
数组中,请勿尝试保留图片,而是保留每个对象的PFFile
...
// in the loop of objects, omit getDataInBackground and just do...
[_bookImageData addObject:object[@"image"]];
所述问题的答案 - 重新加载表的位置 - 是在构建表数据源的循环之后。
for (PFObject *object in objects) {
// code to build all of the arrays, omitting getDataInBackground
// ...
}
[self.tableView reloadData];
在表格视图单元格中,将图像视图替换为PFImageView
,因为它可以为您提取图像数据(以及缓存它等其他有用的东西)。您的cellForRowAtIndexPath:
将会是这样的......
// bookImageLabel must be a PFImageView
// remember, we put the PFFile for each object into the _bookImageData array
cell.bookImageLabel.file = _bookImageData[indexPath.row];
[cell.bookImageLabel loadInBackground];