当使用Parse分配值时,UITableViewCell返回空值

时间:2016-02-20 01:38:25

标签: ios objective-c parse-platform

我有一个UITableViewController,它应该显示所有serviceName和Car Model。我使用字幕作为我的UITableViewCell风格。 serviceName和Car Model存在于Parse中的两个不同表中。我编写了查询,我可以从表中获取serviceName和Car模型的objectID。但是当我尝试使用objectIds从相应的表中获取数据时,我得到一个null值作为返回。

这是我的currentjobs.h文件

#import <UIKit/UIKit.h>
#import <Parse/Parse.h>
@interface currentJobs : UITableViewController{
    NSMutableArray *currentjobs;
    }
@property (strong, nonatomic) IBOutlet UITableView *currentjobTable;
@property (strong, atomic) NSString *servicerequestid;
@property (strong, atomic) NSString *serviceid;
@property (strong, atomic) NSString *carid;

@end

这是我的currentjobs.m文件

#import "currentJobs.h"
#import <Parse/Parse.h>

@interface currentJobs ()

@end

@implementation currentJobs

@synthesize currentjobTable;
@synthesize servicerequestid;
@synthesize serviceid;
@synthesize carid;

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *mechanicid = [PFUser currentUser].objectId;

    PFQuery *query1 = [PFQuery queryWithClassName:@"ServiceStatus"];
    [query1 whereKey:@"mechanic" equalTo:mechanicid];
    [query1 findObjectsInBackgroundWithBlock:^(NSArray *mechanicobjects, NSError *error) {
        if (!error) {
            currentjobs = [[NSMutableArray alloc] initWithArray:mechanicobjects];
            NSLog(@"%@", currentjobs);
        }
        [currentjobTable reloadData];
    }];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return currentjobs.count;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"currentjob" forIndexPath:indexPath];

    // Configure the cell...
    PFObject *mechanic = [currentjobs objectAtIndex:indexPath.row];

    servicerequestid = [mechanic objectForKey:@"servicerequest"];
    NSLog(@"%@", servicerequestid);

    //query to find carid and serviceid
    PFQuery *query2 = [PFQuery queryWithClassName:@"ServiceRequests"];
    [query2 getObjectInBackgroundWithId:servicerequestid block:^(PFObject *servicerequestobject, NSError *error) {
        if (!error){

            serviceid = [servicerequestobject objectForKey:@"serviceName"];
            carid = [servicerequestobject objectForKey:@"car"];


            NSLog(@"%@", serviceid);

            }
    }];

    //query to find servicename and display
   PFQuery *query3 = [PFQuery queryWithClassName:@"services"];
    [query3 getObjectInBackgroundWithId:serviceid block:^(PFObject *serviceNameobject, NSError *error) {
        if (!error){
            NSLog(@"objects Found");
            cell.textLabel.text = [serviceNameobject objectForKey:@"serviceName"];

        }
        else if (error){
            NSLog(@"Error Found");
            NSLog(@"%@", error);
        }
    }];

    //query to find car model and display
   PFQuery *query4 = [PFQuery queryWithClassName:@"customerCars"];
    [query4 getObjectInBackgroundWithId:carid block:^(PFObject *customercarobject, NSError *error) {
        if (!error){
            cell.detailTextLabel.text = [customercarobject objectForKey:@"model"];
        }
    }];


    return cell;
}
@end

query3和query4似乎确实给了我任何类型的输出。我哪里错了?

3 个答案:

答案 0 :(得分:0)

我没有看到你正在实现UITableViewDataSource或UITableViewDelegate协议。我没有看到你将CurrentJobs类设置为tableview的委托和数据源。如果不这样做,你的UITableViewDelegate和UITableViewDatasource方法将在你的CurrentJobs类中被调用。

答案 1 :(得分:0)

我不认为问题与将委托和数据源设置为self有关,因为在创建UITableViewController时默认设置这些值。但是,当表视图加载时,您需要做的就是测试这些方法中的抛出点。这可能是一个异步问题,这意味着您在尝试使用它时实际上并没有数据。我建议清理你的cellForRowAtIndexPath方法。我喜欢保持该方法干净,因为我所做的实际上是使用DAO来保存我的解析方法,或者只是在一个可以在cellForRowAtIndexPath中调用的方法中解析相关的所有调用...只是看起来更好。除此之外,我很确定这是一个异步问题,在使用众多内置解析方法时很常见。

答案 2 :(得分:0)

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface Image : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) UIImage  *image;
@property (nonatomic, strong) NSString *imageId;

@end

#import "Image.h"
#import <Parse/Parse.h>

@interface TableViewController()

@property (nonatomic, strong) NSMutableArray *array;
@property (nonatomic, strong) NSString       *imageId;

@end

@implementation TableViewController
- (void)viewDidLoad {
    [super viewDidLoad];
   [self fetchAllImages];
}

    #pragma mark Retrieve All Images from Parse Server
    -(void)fetchAllImages {
        PFQuery *query = [PFQuery queryWithClassName:@"imagePost"];
        [query findObjectsInBackgroundWithBlock:^(NSArray * _Nullable objects, NSError * _Nullable error) {
            for(PFObject *tempParseObject in objects){
                NSString *imageName       = tempParseObject[@"name"];
                PFFile   *imageFile       = tempParseObject[@"image"];
                NSString *imageId         = tempParseObject.objectId ;
                UIImage *image            = [UIImage imageWithData:imageFile.getData];
                Image *retrievedImage   = [[Image alloc] init];
                retrievedImage.image    = image;
                retrievedImage.name     = imageName;
                retrievedImage.imageId  = imageId;
                [self.array addObject:retrievedImage];
            }
        }];
    }

    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return  self.array.count;
    }

    -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
        if(!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"];
        }
        Image *retrievedImage = [self.array objectAtIndex:indexPath.row];
        cell.imageView.image  = retrievedImage.image;
        cell.textLabel.text   = retrievedImage.name;
        self.imageID          = retrievedImage.imageId;

        return cell;
    }

@end

所以作为一个快速的注释..这不是一个从解析中检索Image / PFFile的好方法,因为它会导致主线程中的长时间运行操作,但它的目的在这里将作为你的一个简单的例子应该在这里构建你的代码。我查询类名并检索图像,名称和objectId,这在视图加载时发生。我将它们存储在临时变量中。然后我初始化我的自定义Image类,并将其属性分配给临时变量。然后我将Image对象添加到我的数组中。然后,此数组用于表视图委托和数据源方法。最后我创建另一个Image变量并将其分配给indexpath.row中的数组,并在那里设置UITableViewCell的TEXT和IMAGE值。

如果需要,可以使用imageId。我不支持命名约定,例如将NSMutableArray命名为&#39; array&#39;但是,它应该是一个普通ivar的属性,尽管它在技术上不会在这种情况下有所作为。希望这个简单的例子有帮助