0

两个 NSLog 都在viewWillAppear显示numberOfRowsInSection我想在 tableView 中填充的数据。

我认为这个问题与返回正确的计数有关,但是由于 NSLogs 匹配,我不确定这是问题所在。

另外,我认为这是问题所在,因为cellForRowAtIndexPath没有被调用。

我没有正确重新加载我的 tableView 吗?非常感谢帮忙。

#import "MainQueryViewController.h"
#import <Parse/Parse.h>
#import "SVProgressHUD.h"
#import "HHPanningTableViewCell.h"
#import "HHInnerShadowView.h"
#import "HHDirectionPanGestureRecognizer.h"

@interface MainQueryViewController () <PFLogInViewControllerDelegate, PFSignUpViewControllerDelegate, HHPanningTableViewCellDelegate>


@end

@implementation MainQueryViewController

@synthesize listArray;



- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {

        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    PFLogInViewController *login = [[PFLogInViewController alloc] init];
    login.fields = PFLogInFieldsFacebook;
    login.delegate = self;
    login.signUpController.delegate = self;
    [self presentModalViewController:login animated:NO];



}

-(void)viewWillAppear:(BOOL)animated {
    PFQuery *query = [PFQuery queryWithClassName:@"ListItem"];

    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            [query whereKey:@"listName" equalTo:[PFUser currentUser]];
            listArray = [objects mutableCopy];
            NSLog(@"I'm about to show you an array");
            NSLog(@"%@", listArray);
        }
        else {
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
    }];

}


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

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    HHPanningTableViewCell *cell = (HHPanningTableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    NSInteger directionMask = indexPath.row % 5;
    if (cell == nil) {
        NSLog(@"Cell = nil.");
        cell = [[HHPanningTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];




    UIView *drawerView = [[UIView alloc] initWithFrame:cell.frame];

    drawerView.backgroundColor = [UIColor greenColor];
    cell.textLabel.text =  [listArray objectAtIndex:indexPath.row];
    cell.drawerView = drawerView;


    // Configure the cell...

}
    if (directionMask < 3) {
        cell.directionMask = directionMask;
    }
    else {
        cell.directionMask = HHPanningTableViewCellDirectionLeft + HHPanningTableViewCellDirectionRight;

        if (directionMask == 4) {
            cell.delegate = self;
        }
    }

    cell.textLabel.text = [self.listArray objectAtIndex:directionMask];

    return cell;
}



#pragma mark - PFLogInViewController delegate

- (void)logInViewController:(PFLogInViewController *)logInController didLogInUser:(PFUser *)user
{
    [self dismissViewControllerAnimated:YES completion:^{
        NSLog(@"Successfully logged in.");
        [SVProgressHUD showSuccessWithStatus:@"Success!"];




    }];

}

- (void)logInViewControllerDidCancelLogIn:(PFLogInViewController *)logInController
{
    [self dismissModalViewControllerAnimated:YES];
    NSLog(@"Login was cancelled!");
}

- (void)signUpViewController:(PFSignUpViewController *)signUpController didSignUpUser:(PFUser *)user
{
    [self dismissModalViewControllerAnimated:YES];
    NSLog(@"Successfully signed up.");
}

- (void)signUpViewControllerDidCancelSignUp:(PFSignUpViewController *)signUpController
{
    [self dismissModalViewControllerAnimated:YES];
    NSLog(@"Sign up was cancelled!");
}



#pragma mark - Table view delegate

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    if ([cell isKindOfClass:[HHPanningTableViewCell class]]) {
        HHPanningTableViewCell *panningTableViewCell = (HHPanningTableViewCell*)cell;

        if ([panningTableViewCell isDrawerRevealed]) {
            return nil;
        }
    }

    return indexPath;
}

- (void)panningTableViewCellDidTrigger:(HHPanningTableViewCell *)cell inDirection:(HHPanningTableViewCellDirection)direction
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Custom Action"
                                                    message:@"You triggered a custom action"
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
}



#pragma mark - UITableViewDelegate

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

}



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

    PFQuery *query = [PFQuery queryWithClassName:@"ListItem"];

    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            [query whereKey:@"listName" equalTo:[PFUser currentUser]];
            listArray = [objects mutableCopy];
            NSLog(@"I'm about to show you an array");
            NSLog(@"%@", listArray);
        }
        else {
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }
    }];

    NSLog(@"This is a count of listArray");
    NSLog(@"%@", listArray);
    return [listArray count];
}


@end

在此处输入图像描述

4

2 回答 2

3

数组末尾的计数是- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section多少?

因为如果我查看PFQuery的文档,我必须说我从未使用过。

findObjectsInBackgroundWithBlock:
异步查找对象并使用结果调用给定块。
- (void)findObjectsInBackgroundWithBlock:(PFArrayResultBlock)block 参数
block
要执行的块。该块应具有以下参数签名:(NSArray 对象,NSError 错误)
讨论
异步查找对象并使用结果调用给定块。

描述会建议在您的方法结束时,数组的计数为“0”。只有稍后当block您通过该方法运行时,您才会拥有一个包含数据的数组。那时你需要保存你的数组并调用[tableView reloadData].

这可以解释这一点:

另外,我认为这是问题所在,因为没有调用 cellForRowAtIndexPath。

这可能是 row in section 为 0 的结果,因为如果您的numberOfRowsInSection 方法被调用,则意味着您dataSource的设置正确。

但是您的代码还有另一个更大的问题。
因为每次表视图想要重新加载它的数据时,你发出一个获取请求,这将要求表视图重新加载自己,这反过来又会要求一个新的查询,这将要求 tableView 重新加载自己,这反过来......你明白了。

您应该在 viewDidLoad、viewWillAppear 或 viewController 生命周期中的其他位置进行查询,这取决于数据的波动性、需要进行调用的频率等。

还要记住,更新 tableView 必须在主线程上完成。PFQuery 的文档没有指定当块运行时您将在哪个线程上运行。

于 2013-03-23T17:35:12.863 回答
-1

获取数据后重新加载表视图:添加以下行:

listArray = [objects mutableCopy];
[tableView reloadData]
于 2013-03-23T16:49:33.117 回答