簡體   English   中英

在didSelectRowAtIndexPath Parse.com中選擇收件人時,PFUser objectId錯誤

[英]Wrong PFUser objectId when selecting recipients in didSelectRowAtIndexPath Parse.com

我目前正在構建一個照片消息傳遞應用程序,用戶可以在其中相互發送照片。 拍照后,您可以從新視圖控制器中的UITableView中選擇收件人。

但是每次我從列表中選擇一個人並發送照片時,都會得到錯誤的user.objectId。 似乎應該使用Friendship objectId,這是另一個名為Friendship的類,它應該使用用戶的objectId。 這是我的做法:

@implementation PickRecipientsViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.recipients = [[NSMutableArray alloc] init];
    [_selectedImage setImage:_image];
    self.tableView.delegate = self;

    [self refreshFriends];
}

- (void)refreshFriends {

    [__acceptedRequests removeAllObjects];
    PFQuery *friendsQuery = [self queryForFriends];
    PFQuery *acceptedRequestQuery = [self queryForAcceptedFriendRequests];
    PFQuery *friendRequestsQuery = [self queryForRequests];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

        // Find friends
        NSArray *objects = [friendsQuery findObjects];
        for (PFObject * obj in objects) {
            [obj[@"user1"] fetchIfNeeded];
            [obj[@"user2"] fetchIfNeeded];
        }
        _friends = [objects mutableCopy];

        // Find pending requests
        objects = [friendRequestsQuery findObjects];
        for (PFObject *obj in objects) {
            [obj[@"fromUser"] fetchIfNeeded];
        }
        __friendRequests = [objects mutableCopy];

        // Find accepted requests
        objects = [acceptedRequestQuery findObjects];
        for (PFObject *obj in objects) {
            PFUser *to = (PFUser*)[obj[@"toUser"] fetchIfNeeded];
            [obj deleteEventually];
            [__acceptedRequests addObject:to[@"username"]];
        }

        // show accepted requests
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView reloadData];
            if (__acceptedRequests.count > 0) {
                NSString *friends = __acceptedRequests[0];
                for (int i = 1; i < __acceptedRequests.count; ++i) {
                    friends = [friends stringByAppendingFormat:@", %@", __acceptedRequests[i]];
                }
                friends = [friends stringByAppendingString:@" accepted your friend request"];

                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"New Friends" message:friends delegate:self cancelButtonTitle:@"Wuhu" otherButtonTitles:nil, nil];
                alert.tag = kAlertTagAcceptedRequest;
                [alert show];
            }
        });
    });
}

- (PFQuery *)queryForAcceptedFriendRequests {
    PFUser *user = [PFUser currentUser];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status = %@ AND (fromUser = %@ AND toUser != %@)", @"approved", user, user];
    PFQuery *acceptedRequestQuery = [PFQuery queryWithClassName:@"FriendRequest" predicate:predicate];
    return acceptedRequestQuery;
}

- (PFQuery *)queryForFriends {
    PFUser *user = [PFUser currentUser];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user1 = %@ AND user2 != %@ OR user1 != %@ AND user2 = %@", user, user, user, user];
    PFQuery *friendsQuery = [PFQuery queryWithClassName:@"Friendship" predicate:predicate];
    return friendsQuery;
}

- (PFQuery *)queryForRequests {
    PFUser *user = [PFUser currentUser];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status = %@ AND (toUser = %@ AND fromUser != %@)", @"pending", user, user];
    PFQuery *friendRequests = [PFQuery queryWithClassName:@"FriendRequest" predicate:predicate];
    return friendRequests;
}

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

    PFUser *user = [self.friends objectAtIndex:indexPath.row];

    if([self.recipients containsObject:user.objectId]){
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }else{
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    PFObject *friendRequest = [_friends objectAtIndex:indexPath.row];
    PFUser *user1 = (PFUser *)friendRequest[@"user1"];
    PFUser *user2   = (PFUser *)friendRequest[@"user2"];

    if ([user1.username isEqualToString:[PFUser currentUser].username]) {
        cell.nameL.text = user2[@"username"];

        [(PFFile*)user2[@"profilePic"] getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
            if (error) {return;}
            cell.profilePic.image = [UIImage imageWithData:data];
        }];

    } else if ([user2.username isEqualToString:[PFUser currentUser].username]) {
        cell.nameL.text = user1[@"username"];

        [(PFFile*)user1[@"profilePic"] getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
            if (error) {return;}
            cell.profilePic.image = [UIImage imageWithData:data];
        }];
    }
    return cell;
}

- (BOOL)isFriend:(PFUser *)user {
    for (PFUser *friend in self.friends) {
        if ([friend.objectId isEqualToString:user.objectId]) {
            return YES;
        }
    }
    return NO;
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

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

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 68;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [self.tableView deselectRowAtIndexPath:indexPath animated:NO];

    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    PFUser *user = [self.friends objectAtIndex:indexPath.row];

    if (cell.accessoryType == UITableViewCellAccessoryNone){
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        [self.recipients addObject:user.objectId];
    } else{
        cell.accessoryType = UITableViewCellAccessoryNone;
        [self.recipients removeObject:user.objectId];
    }
}

- (IBAction)sendImage {

    PFObject *message = [PFObject objectWithClassName:@"Messages"];

    [message setObject:[PFUser currentUser] forKey:@"fromUser"];
    [message setObject:[PFUser currentUser] forKey:@"toUser"];
    [message setObject:@"image" forKey:@"fileType"];

    [message setObject:self.recipients forKey:@"recipientIds"];
    [message setObject:[[PFUser currentUser] objectId] forKey:@"senderId"];

    // Image
    NSData *imageData = UIImageJPEGRepresentation(_image, 1.0);
    NSString *filename = [NSString stringWithFormat:@"image.png"];
    PFFile *imageFile = [PFFile fileWithName:filename data:imageData];
    [message setObject:imageFile forKey:@"file"];

    [message saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        if (!error) {

            // Dismiss the controller
            [[[self presentingViewController] presentingViewController] dismissViewControllerAnimated:YES completion:nil];

        } else {
            [SVProgressHUD showErrorWithStatus:@"Oh darn! Something went wrong :("];
        }
    }];
}

@end

因為_friendsFriendship對象的數組,所以當點擊一行時,您只是直接將其從數組中移出,然后又不從中獲取合適的用戶(就像配置單元格標簽時一樣)。

因此,在tableView:didSelectRowAtIndexPath:您應該具有以下內容:

BOOL adding = NO;

if (cell.accessoryType == UITableViewCellAccessoryNone){
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    adding = YES;
} else {
    cell.accessoryType = UITableViewCellAccessoryNone;
}

PFObject *friendRequest = [_friends objectAtIndex:indexPath.row];
PFUser *user1 = (PFUser *)friendRequest[@"user1"];
PFUser *user2 = (PFUser *)friendRequest[@"user2"];

PFUser *recipient = nil;

if ([user1.username isEqualToString:[PFUser currentUser].username]) {
    recipient = user2;
} else if ([user2.username isEqualToString:[PFUser currentUser].username]) {
    recipient = user1;
}

if (adding) {
    [self.recipients addObject:recipient.objectId];
} else {
    [self.recipients removeObject:recipient.objectId];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM