UILabel上PFObject显示的查询解析指针在不同的Class - Objective-C中

时间:2016-08-12 16:50:33

标签: ios objective-c pointers parse-platform uilabel

我把自己画成了一个角落,我需要一些帮助!

Parse Class“Order”保存用户将产品添加到其包中时创建的数据,包括用于“jarName”的PFObject指针,该指针指向具有字符串“jarName”的Parse类“Jar”。

我需要在位于UITableViewController“BagTableViewController”上的PFTableViewCell“OrderItemTableViewCell”的UILabel中显示字符串“jarName”。但是......这就是我自己画的角落......“OrderItemTableViewCell”使用模型“OrderItem”,但“jarName”不在OrderItem模型(或Parse类)上,它在Order模型和Parse上“订单”类。

Parse Class Order holding Pointer jarName

jarName是指向字符串“jarName”的Parse Class“Jar”的指针。

Parse Class Jar holding String jarName

PFObjet jarName是在UITableViewController上创建的

@interface ProductDetailViewController ()

{
    PFObject* _selectedJar;
}

"ProductDetailViewController" when a user selects the Product they want to purchase, select the jarName associated with that Product and then adds them to their bag using a UIButton. The view then pops to BagTableViewController.

    //  ProductDetailViewController.m    
    - (void)didSelectAddToBagButton:(UIButton *)addToBagButton {
            if (![User currentUser]) {
                [self showWarning];
            } else {
                if (self.order) {
                    if ([self.order.items count] > 0) {
                        if ([self containsProduct:self.order.items target:self.product] > -1) {
                            int index = [self containsProduct:self.order.items target:self.product];
                            NSMutableArray *eItems = [NSMutableArray arrayWithArray:self.order.items];
                            OrderItem *foundItem = eItems[index];
                            [foundItem setQuantity:foundItem.quantity+1];
                            [eItems replaceObjectAtIndex:index withObject:foundItem];
                            self.order.items = [eItems copy];
                        } else {
                            [self.order addSingleProduct:self.product];
                        }
                    } else {
                        [self.order addSingleProduct:self.product];
                    }
                } else {
                    self.order = [Order object];
                    [self.order setCustomer:[User currentUser]];
                    [self.order setOrderStatus:ORDER_NOT_MADE];
                    [self.order addSingleProduct:self.product];
                    [self.order setJarName:_selectedJar];

                }
            }

BagTableViewController包含视图OrderItemTableViewCell,该视图由与Parse Class OrderItem关联的OrderItem模型中的数据填充。

//  BagTableViewController.m

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 130;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.order.items count];
}

- (OrderItemTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    OrderItemTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BagItemCell" forIndexPath:indexPath];
    if (self.order) [cell configureItem:self.order.items[indexPath.row] tag:indexPath.row];
    else [cell configureItem:nil tag:100+indexPath.row];
        return cell;
}

所以,这就是擦......

我需要使用来自Parse Class Order的数据填充OrderItemTableViewCell内的UILabel,而其他4个标签正由Parse Class OrderItem中的数据填充。

//  OrderItemTableViewCell.m

@interface OrderItemTableViewCell()
@property (nonatomic, weak) IBOutlet UILabel *jarNameLabel;
@property (nonatomic, weak) IBOutlet UILabel *nameLabel;
@property (nonatomic, weak) IBOutlet UILabel *unitPriceLabel;
@property (nonatomic, weak) IBOutlet UILabel *quantityLabel;
@property (nonatomic, weak) IBOutlet UIStepper *quantityStepper;
@end

@implementation OrderItemTableViewCell

    -(void)configureItem:(OrderItem *)item tag:(long)tag{
        if (item) {

            self.nameLabel.text = item.product.name;
            self.unitPriceLabel.text = [item.product friendlyPrice];
            self.quantityLabel.text = [item friendlyQuantity];
            self.quantityStepper.hidden = NO;
            self.quantityStepper.value = item.quantity;
            self.quantityStepper.stepValue = 1;
            self.quantityStepper.tag = tag + 100;
        } else {
            self.nameLabel.text = @"";
            self.unitPriceLabel.text = @"";
            self.quantityLabel.text = @"";
            self.quantityStepper.hidden = YES;
        }
    }
@end

基本上,我在一个不同的类中有一个指针需要检索并将字符串显示为UILabel。

(1)如何从Parse Class Order查询指针“jarName”并让它从Parse Class“Jar”中返回字符串“jarName”?

(2)如何在OrderItemTableViewCell的UILabel上显示该字符串(由OrderItem模型填充...不包含字符串或指针)?

1 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题...... 您调用FetchIfNeeded来填充嵌套在PFObject内的指针对象。这是有效的,我用它来一直填充指针,以及指针等指针指针内的对象和值等等。你可以像你一样嵌套多个指针,只需调用这个方法在指针对象上,等待完成,然后在指针所在的位置设置对象。

示例:

PFObject * orderObjectFromOrderClass = [PFObject objectWithClassName:@"Order"];
[[orderObjectFromOrderClass objectForKey:@"jarName"] fetchIfNeededInBackgroundWithBlock:^(PFObject * _Nullable object, NSError * _Nullable error) {
    if (!error) {
        [orderObjectFromOrderClass setObject:object forKey:@"jarName"];
    }
}];

NSString * jarName = [[orderObjectFromOrderClass objectForKey:@"jarName"] valueForKey:@"jarName"];

关键注意事项:

如果您无法使用FetchIfNeeded获取指针,则会抛出一个错误,您需要调用" FetchIfNeeded"在指针对象FIRST上,因为该值不存在。所以,如果你有一个带有指针的类,你就可以使用PFQuery和" includeKey" (有或没有点符号取决于你的需求)然后你正在调用的PFObject将没有这些指针对象的数据。如果你还没有充实那些指针值,你必须调用FetchIfNeeded。

更新,在内部定义NSString,以确保您拥有NSString的值

PFObject * orderObjectFromOrderClass = [PFObject objectWithClassName:@"Order"];
    [[orderObjectFromOrderClass objectForKey:@"jarName"] fetchIfNeededInBackgroundWithBlock:^(PFObject * _Nullable object, NSError * _Nullable error) {
        if (!error) {
            [orderObjectFromOrderClass setObject:object forKey:@"jarName"];
            NSString * jarName = [[orderObjectFromOrderClass objectForKey:@"jarName"] valueForKey:@"jarName"];
            // set your cell lable text here to make sure there's a value for "jarName" from the pointer
        }
    }];