无法使用JSON数据设置UITableView节标题

时间:2014-06-11 21:35:05

标签: ios objective-c json uitableview

我的Parse云代码将JSON数据返回到我的iOS应用程序,我想将UITableView的部分标题设置为它返回的Search Term属性。我已尝试引用matchCenterDictionary以便专门选择该密钥,但它只显示(null)作为节标题。

在设置单元格的文本标签时,以这种方式引用字典工作得非常好,所以我不确定为什么它不能用于此目的。

MatchCenterViewController.h:

#import <UIKit/UIKit.h>
#import <Parse/Parse.h>
#import "AsyncImageView.h"
#import "SearchViewController.h"

@interface MatchCenterViewController : UIViewController <UITableViewDataSource>

@property (nonatomic) IBOutlet NSString *itemSearch;

@property (nonatomic, strong) NSArray *imageURLs;
@property (strong, nonatomic) NSString *matchingCategoryCondition;
@property (strong, nonatomic) NSString *matchingCategoryLocation;
@property (strong, nonatomic) NSNumber *matchingCategoryMaxPrice;
@property (strong, nonatomic) NSNumber *matchingCategoryMinPrice;

@property (strong, nonatomic) NSArray *matchCenterArray;
@property (strong, nonatomic) NSDictionary *matchCenterDictionary;

@end

MatchCenterViewController.m:

#import "MatchCenterViewController.h"
#import <UIKit/UIKit.h>

@interface MatchCenterViewController () <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) UITableView *matchCenter;
@end

@implementation MatchCenterViewController


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
    }
    return self;
}


- (void)viewDidLoad
{
    [super viewDidLoad];

    self.matchCenter = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewCellStyleSubtitle];
    self.matchCenter.frame = CGRectMake(0,50,320,self.view.frame.size.height-200);
    _matchCenter.dataSource = self;
    _matchCenter.delegate = self;
    [self.view addSubview:self.matchCenter];

    self.matchCenterArray = [[NSArray alloc] init];
}

- (void)viewDidAppear:(BOOL)animated
{
    self.matchCenterArray = [[NSArray alloc] init];

    [PFCloud callFunctionInBackground:@"MatchCenter"
                       withParameters:@{
                                        @"test": @"Hi",
                                        }
                                block:^(NSDictionary *result, NSError *error) {

                                    if (!error) {
                                         self.matchCenterArray = [result objectForKey:@"Top 3"];

                                        dispatch_async(dispatch_get_main_queue(), ^{
                                            [_matchCenter reloadData];
                                        });

                                        NSLog(@"Test Result: '%@'", result);
                                    }
                                }];
}




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




//the part where i setup sections and the deleting of said sections

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 21.0f;
}



- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 21)];
    headerView.backgroundColor = [UIColor lightGrayColor];

    NSString *searchTerm = [_matchCenterDictionary objectForKey:@"Search Term"];

    UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(8, 0, 250, 21)];
    headerLabel.text = [NSString stringWithFormat:@"%@", searchTerm];
    headerLabel.font = [UIFont boldSystemFontOfSize:[UIFont systemFontSize]];
    headerLabel.textColor = [UIColor whiteColor];
    headerLabel.backgroundColor = [UIColor lightGrayColor];
    [headerView addSubview:headerLabel];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.tag = section + 1000;
    button.frame = CGRectMake(300, 2, 17, 17);
    [button setImage:[UIImage imageNamed:@"31-circle-x"] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(deleteButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [headerView addSubview:button];
    return headerView;
}



- (IBAction)deleteButtonPressed:(UIButton *)sender {
//    NSInteger section = sender.tag - 1000;
//    [self.objects removeObjectAtIndex:section];
//    [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationAutomatic];
//    
//    // reload sections to get the new titles and tags
//    NSInteger sectionCount = [self.objects count];
//    NSIndexSet *indexes = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, sectionCount)];
//    [self.tableView reloadSections:indexes withRowAnimation:UITableViewRowAnimationNone];
}






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



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Initialize cell
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        // if no cell could be dequeued create a new one
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    // populate dictionary with results
    NSDictionary *matchCenterDictionary= [self.matchCenterArray objectAtIndex:indexPath.row];

    // title of the item
    cell.textLabel.text = [matchCenterDictionary objectForKey:@"Title"];
    cell.textLabel.font = [UIFont boldSystemFontOfSize:12];

    // price of the item
    cell.detailTextLabel.text = [NSString stringWithFormat:@"$%@", [matchCenterDictionary objectForKey:@"Price"]];
    cell.detailTextLabel.textColor = [UIColor colorWithRed:0/255.0f green:127/255.0f blue:31/255.0f alpha:1.0f];


    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[matchCenterDictionary objectForKey:@"Image URL"]]];
    [[cell imageView] setImage:[UIImage imageWithData:imageData]];



    return cell;
}

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


/*
#pragma mark - Navigation

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end

返回JSON:

    {
    "Top 3" =     (
                {
            "Image URL" = "http://thumbs4.ebaystatic.com/m/maPdKVZiQtK7oHcR-PY81sg/140.jpg";
            "Item URL" = "http://www.ebay.com/itm/Samsung-Galaxy-S5-SM-G900P-16GB-Black-Sprint-Brand-New-s5-LTE-ESN-BAD-/261503613519?pt=Cell_Phones";
            Price = "390.0";
            "Search Term" = "moto x 16gb";
            Title = "Samsung Galaxy S5 SM-G900P 16GB Black (Sprint) Brand New s5 LTE *ESN BAD*";
        },
                {
            "Image URL" = "http://thumbs4.ebaystatic.com/m/mkF9PJ_sT3_yGR_3AVM8TAA/140.jpg";
            "Item URL" = "http://www.ebay.com/itm/HDC-Galaxy-S5-SM-G900-Unlocked-Smartphone-White-16-GB-GSM-WCDMA-1-7GHz-Octa-Core-/281356592227?pt=Cell_Phones";
            Price = "279.99";
            "Search Term" = "moto x 16gb";
            Title = "HDC Galaxy S5 SM-G900 Unlocked Smartphone White 16 GB GSM WCDMA 1.7GHz Octa Core";
        },
                {
            "Image URL" = "http://thumbs1.ebaystatic.com/m/mkwGBy79W6XidMm0ZALMthw/140.jpg";
            "Item URL" = "http://www.ebay.com/itm/SAMSUNG-GALAXY-S5-SM-G900P-16GB-sprint-READ-DESCRIPTION-/141313501036?pt=Cell_Phones";
            Price = "379.0";
            "Search Term" = "moto x 16gb";
            Title = "SAMSUNG GALAXY S5 SM-G900P - 16GB (sprint)- READ DESCRIPTION !!!";
        }
    );
}

2 个答案:

答案 0 :(得分:1)

您应该使用self.matchCenterArray而不是_matchCenterDictionary

您必须这样做的方法是解析数据。

NSString *searchTerm = [[self.matchCenterArray objectAtIndex:section] objectForKey:@"Search Term"];

答案 1 :(得分:1)

按照Adrian的说明(使用self.matchCenterArray)。

然后改变这个:

NSString *searchTerm = [self.matchCenterArray objectForKey:@"Search Term"];

,例如:

NSString *searchTerm = [[self.matchCenterArray firstObject] objectForKey:@"Search Term"];

搜索词位于数组中的每个NSDictionary中。因此您需要首先检索firstObject。