UITableView cellForRowAtIndexPath未被调用

时间:2015-12-22 01:50:52

标签: ios objective-c uitableview delegates datasource

我知道不会调用cellForRowAtIndexPath方法,因为我从未在其中看到dataSource个消息。我已设置delegate的{​​{1}}和UITableView属性,并且我还在头文件中声明了UITableViewDelegateUITableViewDataSource。我错过了什么?

- (void)viewDidLoad {
[self.view setBackgroundColor:[UIColor grayColor]];
tableData = [[NSMutableArray alloc] init];
matchesForUser = [[NSMutableArray alloc] init];
sortedFirstArray = [[NSArray alloc] init];
sortedSecondArray = [[NSArray alloc] init];

_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - 20) style:UITableViewStylePlain];
_tableView.dataSource = self;
_tableView.delegate = self;
[self.view addSubview:_tableView];

countUsers = 0;
PFQuery *query = [PFQuery queryWithClassName:@"_User"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (!error) {
        for (PFObject *object in objects) {
            NSLog(@"%@", object.objectId);
            tableData[countUsers] = [object valueForKey:@"username"];
            matchesForUser[countUsers] = [object valueForKey:@"matches"];
        }
    }else{
        NSLog([error description]);
    }

    NSLog(@"***tabledata***");
    NSLog([NSString stringWithFormat:@"%lu", (unsigned long)[tableData count]]);
    NSLog(@"***matchesdata***");
    NSLog([NSString stringWithFormat:@"%lu", (unsigned long)[matchesForUser count]]);
}];

dictionary = [NSDictionary dictionaryWithObjects:matchesForUser forKeys:tableData];
sortedFirstArray = [[dictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];
sortedSecondArray = [dictionary objectsForKeys:sortedFirstArray notFoundMarker:[NSNull null]];

backToMap = [[UIButton alloc] initWithFrame:CGRectMake(80, 518, 160, 30)];
backToMap.backgroundColor = [UIColor colorWithRed:33.0f/255.0f green:156.0f/255.0f blue:41.0f/255.0f alpha:1.0f];
[backToMap addTarget:self action:@selector(dismiss) forControlEvents:UIControlEventTouchUpInside];
[backToMap setTitle:@"BACK TO MAP" forState:UIControlStateNormal];
[self.view addSubview:backToMap];
}

- (void)dismiss {
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [tableData count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *simpleTableIdentifier = @"SimpleTableItem";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }

    NSString *username = [[sortedFirstArray objectAtIndex:indexPath.row] stringByAppendingString:@" "];
    NSString *matchAmount = [sortedSecondArray objectAtIndex:indexPath.row];

    NSLog(@"***username***");
    NSLog(username);
    NSLog(@"***matchamount***");
    NSLog(matchAmount);

    cell.textLabel.text = [username stringByAppendingString:matchAmount];

    return cell;
}

5 个答案:

答案 0 :(得分:5)

尝试做以下事情

1。)注册你的tableView

[_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"SimpleTableItem"];

2.)然后在

下方添加[_tableView reloadData];
for (PFObject *object in objects) {
        NSLog(@"%@", object.objectId);
        tableData[countUsers] = [object valueForKey:@"username"];
        matchesForUser[countUsers] = [object valueForKey:@"matches"];
    }

if (!error)部分内..

因此,您的更新代码必须类似于

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
    for (PFObject *object in objects) {
        NSLog(@"%@", object.objectId);
        tableData[countUsers] = [object valueForKey:@"username"];
        matchesForUser[countUsers] = [object valueForKey:@"matches"];
    }
    [_tableView reloadData];
}else{
    NSLog([error description]);
}

NSLog(@"***tabledata***");
NSLog([NSString stringWithFormat:@"%lu", (unsigned long)[tableData count]]);
NSLog(@"***matchesdata***");
NSLog([NSString stringWithFormat:@"%lu", (unsigned long)[matchesForUser count]]);
}];

答案 1 :(得分:2)

1)在这里你需要使用 countUsers = 0 ;如果需要,你需要将for循环中的值增加1.否则每次都会覆盖索引0处的值。

2)您正在使用后台调用方法来获取数据。因此,获取数据需要时间,控制将进一步执行以下代码。但此时 matchesForUser数组为空,并且字典也是空的。因此在单元格中它不会显示任何内容,您也不会从单元格中看到NSLOG。

而不是这个

INI

dictionary = [NSDictionary dictionaryWithObjects:matchesForUser forKeys:tableData];
sortedFirstArray = [[dictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];
sortedSecondArray = [dictionary objectsForKeys:sortedFirstArray notFoundMarker:[NSNull null]];

3)试试这个,

PFQuery *query = [PFQuery queryWithClassName:@"_User"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^{
        if (!error) {
            for (PFObject *object in objects) {
                NSLog(@"%@", object.objectId);
                [tableData addObject:[object valueForKey:@"username"]];
                [matchesForUser addObject:[object valueForKey:@"matches"]];
            }
            dictionary = [NSDictionary dictionaryWithObjects:matchesForUser forKeys:tableData];
            sortedFirstArray = [[dictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];
            sortedSecondArray = [dictionary objectsForKeys:sortedFirstArray notFoundMarker:[NSNull null]];
            [_tableView reloadData];

        }else{
            NSLog([error description]);
        }

        NSLog(@"***tabledata***");
        NSLog([NSString stringWithFormat:@"%lu", (unsigned long)[tableData count]]);
        NSLog(@"***matchesdata***");
        NSLog([NSString stringWithFormat:@"%lu", (unsigned long)[matchesForUser count]]);
    });
}];

答案 2 :(得分:1)

您是否在ViewDidLoad中重新加载了Tableview?像

[_tableView reloadData];

答案 3 :(得分:1)

之后重新加载表格
dictionary = [NSDictionary dictionaryWithObjects:matchesForUser forKeys:tableData];
sortedFirstArray = [[dictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];
sortedSecondArray = [dictionary objectsForKeys:sortedFirstArray notFoundMarker:[NSNull null]];

[_tableView reloadData];

答案 4 :(得分:0)

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [tableData count];
}

count是0?您可以输入NSLog("%@", @(tableData.count));或仅return 1;进行测试。 UITableView首先发送tableView:numberOfRowsInSection:,如果方法返回0.它将不会调用cellForRowAtIndexPath

正如@PiyushSharma所提到的,你应该Register your tableView