0

我有一个实例变量数组:

       @interface ChannelsVC ()
        {
        NSArray *arrayofFrequencies;
        }
    }
    @end

@implementation ChannelsVC
......

在“viewDidLoad”中进行分配

arrayofFrequencies=[[NSArray alloc]init];

然后,我将来自 JSON 数据源的数据插入到数组中:

-(void)GetFrequencies{

    NSString *urla=@"http://xxxxxxxx";
    NSString *uria = [urla stringByAppendingString:self.lien_satellite];
    NSURL *urlFrequencies= [ NSURL URLWithString:uria];

    NSLog(@"Frequencies URI: %@",uria); //correct URI



    NSURLRequest *request = [NSURLRequest requestWithURL:urlFrequencies];

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        arrayofFrequencies=[JSON valueForKeyPath:@"frequency"];

        NSLog(@"Frequencies count: %lu", (unsigned long)[arrayofFrequencies count]);//the count here is correct, I have data in the array

     } failure:nil];

    [operation start];

 }

问题是当想要制作一个 UITableView 时,它的节数是 '[arrayofFrequencies count];' ,它总是返回 '0' !它是一个实例变量,它在“GetFrequencies”函数之外返回零。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSLog(@"number of sections %ld",(long)[arrayofFrequencies count]); // always returns 0
    return [arrayofFrequencies count];
}

难道我做错了什么?

谢谢你的帮助。

控制台输出:

013-06-25 12:58:00.163 Frequencies[840:c07] number of sections 0
2013-06-25 12:58:00.165 Frequencies[840:c07] number of sections 0
2013-06-25 12:58:00.641 Frequencies[840:c07] Frequencies count: 4
4

3 回答 3

2

之后调用 [tableView reloadData]

NSLog(@"Frequencies count: %lu", (unsigned long)[arrayofFrequencies count]);//the count here is correct, I have data in the array

要理解的是在 viewDidLoad tableView 中调用了委托。那时数组计数为零。稍后的数组被对象填充。 reloadData方法再次调用表的委托方法。

于 2013-06-25T12:00:27.687 回答
1

您的日志控制台非常清楚地表明您的数据源方法在数据加载之前调用。

这是非常正常的,因为您在故事板(或界面)或 viewDidLoad 中设置了数据源。

您只需要在数据加载UITableView后重新加载

尝试这个:

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        arrayofFrequencies=[JSON valueForKeyPath:@"frequency"];

        [tableView setDataSource:self];
        [tableView reloadData];

     } failure:nil];

您应该从界面构建器或情节提要或 viewDidLoad 中删除数据源,以便 UITableView 不会自行重新加载两次。

于 2013-06-25T12:06:42.120 回答
0

可能的猜测是 tableView 委托被提前调用,但服务器的响应是在一段时间后出现的,所以在得到响应后尝试重新加载下面的 tabview 是代码。

    -(void)GetFrequencies{

        NSString *urla=@"http://xxxxxxxx";
        NSString *uria = [urla stringByAppendingString:self.lien_satellite];
        NSURL *urlFrequencies= [ NSURL URLWithString:uria];
        NSLog(@"Frequencies URI: %@",uria); //correct URI
        NSURLRequest *request = [NSURLRequest requestWithURL:urlFrequencies];
        AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

            arrayofFrequencies=[JSON valueForKeyPath:@"frequency"];
            NSLog(@"Frequencies count: %lu", (unsigned long)[arrayofFrequencies count]); 
            // reload the table here 
            [tableView reloadData];
         } failure:nil];
        [operation start];
    }

尝试这样做。

于 2013-06-25T12:02:47.383 回答