1

为了设置 UITableView 单元格的字体、textLabel 和颜色,许多方法在 iOS 7 中已弃用。我也很难用这些值填充视图。这是我的代码片段:

- (void)fetchedData:(NSData *)responseData {
    //parse out the json data
    NSError* error;
    NSDictionary* json = [NSJSONSerialization
                          JSONObjectWithData:responseData

                          options:kNilOptions
                          error:&error];

    NSArray* jobs = [json objectForKey:@"results"];

    for(NSDictionary *jobsInfo in jobs) {

        JobInfo *jobby = [[JobInfo alloc] init];
        jobby.city = jobsInfo[@"city"];
        jobby.company = jobsInfo[@"company"];
        jobby.url = jobsInfo[@"url"];
        jobby.title = jobsInfo[@"jobtitle"];
        jobby.snippet = jobsInfo[@"snippet"];
        jobby.state = jobsInfo[@"state"];
        jobby.time = jobsInfo[@"date"];

        jobsArray = [jobsInfo objectForKey:@"results"];
    }
}

我正在遍历来自 GET 请求的字典数组并进行解析。我现在正在尝试使用以下代码填充我的 UITableView:

-

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

    // Return the number of rows in the section.
    return [jobsArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    NSDictionary *jobsDic = [jobsArray objectAtIndex:indexPath.row];
    [cell.textLabel setText:[jobsDic objectForKey:@"jobtitle"]];


    return cell;
}

另外,我已经声明这是在我的 .h 文件中:

NSArray *jobsDic;

关于我做错了什么的任何想法?这是 iOS 7 的问题吗?

4

2 回答 2

0

您似乎在 forin 循环结束时重新初始化了 jobsarray 。

你不是这个意思吗?

NSArray* jobs = [json objectForKey:@"results"];
NSMutableArray *jobsTemp = [[NSMutableArray alloc] initWithCapacity:jobs.count];
for(NSDictionary *jobsInfo in jobs) {

    JobInfo *jobby = [[JobInfo alloc] init];
    jobby.city = jobsInfo[@"city"];
    jobby.company = jobsInfo[@"company"];
    jobby.url = jobsInfo[@"url"];
    jobby.title = jobsInfo[@"jobtitle"];
    jobby.snippet = jobsInfo[@"snippet"];
    jobby.state = jobsInfo[@"state"];
    jobby.time = jobsInfo[@"date"];

    [jobsTemp addObject:jobby];
}
self.jobsArray = jobsTemp; //set @property (nonatomic, copy) NSArray *jobsArray; in the .h
[self.tableView reloadData]; //optional only if the data is loaded after the view

在行方法的单元格中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    JobInfo *job = self.jobsArray[indexPath.row];
    cell.textLabel.text = job.title;

    return cell;
}

不要忘记:

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

更新 - 用户建议编辑:

确实 count 不是 NSArray 属性。但是由于 Objective-C 允许我们使用快捷表示法来调用带点的方法,所以这段代码可以工作。您必须知道这一点的限制:如果您使用带有自定义 getter 的计数属性的 NSArray 子类,这可能会产生副作用@property (nonatomic, strong, getter=myCustomCount) NSUInteger count。因为我认为代码可读性对我来说是我更喜欢使用点符号的最重要的事情之一。我认为 Apple 应该将 count 实现为只读属性,所以我以这种方式使用它(但这是我的观点)。因此,对于那些不同意我return [self.jobsArray count];的观点,只需阅读 tableView:numberOfRowsInSection: 方法即可。

于 2013-10-18T16:47:15.747 回答
0

将 jobsArray 的声明从 NSArray 更改为 NSMutableArray。

在fetchedData方法的开头添加一个初始化,如下所示。

if(!jobsArray) {
   jobsArray = [NSMutableArray array];
}
else {
   [jobsArray removeAllObjects];
}

删除以下行。

jobsArray = [jobsInfo objectForKey:@"results"];

取而代之的是,在 for 循环结束时将初始化的对象添加到数组中。

[jobsArray addObject:jobby];

添加一个[tableView reloadData];在你的 *-(void)fetchedData:(NSData )responseData; 方法实现。

最初,当您加载视图时,tableView 将被填充。收到数据后,tableView 将不知道收到了。

其他一切似乎都很好。希望休息会很好。

于 2013-10-18T16:47:19.517 回答