从 JSON 数据填充 UITableView

Posted

技术标签:

【中文标题】从 JSON 数据填充 UITableView【英文标题】:Populate UITableView from JSON data 【发布时间】:2016-05-28 18:13:21 【问题描述】:

我有 JSON 数据

["id": 1,"Name": "Nodia","company": "WWW","position": "HR","email": "sss@www.com","number": "33","photo": "image1.png", "id": 2,"Name": "Nona ","company": "SSS","position": "Head of Department","email": "aaaa@samsda.ge","number": "5496","photo": "image2.png", "id": 3,"Name": "David","company": "DDD","position": "Director","email": "test@sasd.e","number": "574","photo": "image3.png",....]|

我创建了一个值为 Name 的表格视图。

Tableviewcontroller.h :
     @interface CitiesViewController ()
        @property(nonatomic,strong)NSMutableArray *jsonArray
        @property(nonatomic,strong)NSMutableArray *citiesArray;
-(void)retrieveData;

Tableviewcontroller.m :
   @implementation CitiesViewController
        @synthesize 

citiesArray,jsonArray;

    #pragma mark -

    #pragma mark Class Methods

    -(void)retrieveData
    

        NSURL *url = [NSURL URLWithString:getDataURL];
        NSData *data = [NSData dataWithContentsOfURL:url];

        jsonArray = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

        citiesArray =[[NSMutableArray alloc]init];

        for (int i= 0; i<jsonArray.count; i++)
        
            NSString *cID = [[jsonArray objectAtIndex:i] objectForKey:@"id"];
            NSString *cName = [[jsonArray objectAtIndex:i] objectForKey:@"Name"];
            NSString *cCompany = [[jsonArray objectAtIndex:i] objectForKey:@"company"];
            NSString *cPosition = [[jsonArray objectAtIndex:i] objectForKey:@"position"];
            NSString *cEmail = [[jsonArray objectAtIndex:i] objectForKey:@"email"];

            NSString *cNumber = [[jsonArray objectAtIndex:i] objectForKey:@"number"];
            NSString *cPhoto = [[jsonArray objectAtIndex:i] objectForKey:@"photo"];

            NSURL *urlOne = [NSURL URLWithString:cPhoto];
       //     NSLog(@"%@",urlOne);
            NSData *photoData = [NSData dataWithContentsOfURL:urlOne];
            UIImage *imageOne = [[UIImage alloc] initWithData:photoData];

            [citiesArray addObject:[[City alloc]initWithCityName:cName andCityState:cCompany andCityCountry:cEmail andCityPopulation:cPosition andCityID:cID andCityNumber:cNumber andCityPhoto: (UIImage *) imageOne]];

        

        [self.tableView reloadData];

    

    - (void)viewDidLoad 
        [super viewDidLoad];

       [self retrieveData];

    

    #pragma mark - Table view data source

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

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
            return citiesArray.count;

    

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 


        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

        // Configure the cell...


        City *cityob;
        cityob=[citiesArray objectAtIndex:indexPath.row];
        cell.textLabel.text=cityob.employeeName;


        return cell;

    

一切正常。单元格显示数据。但问题是我无法在 TableView 中为部分和部分索引标题设置标题标题。我想要部分的字母标题 因为数据是动态的,静态的解决问题是不合适的。 like in this tutriole

非常感谢。请原谅我的英语不好!

【问题讨论】:

虽然这是 Swift 版本的代码,但您应该使用 func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -&gt; String? ,它是 UITableViewDelegate 的扩展。可以参考this。 @ama 再详细一点? @amagain - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 但我不知道如何实现 【参考方案1】:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    
       return [citiesArray objectAtIndex:section];
    

请检查并进行适当的修改。

【讨论】:

可以为字母创建一个单独的数组吗?我想要部分的字母标题【参考方案2】:

如前所述,您需要实现 tableView:titleForHeaderInSection:。你目前只有一个部分,不清楚你想展示什么,但一个示例实现看起来像这样:

- (NSString *)tableView:(UITableView *)aTableView titleForHeaderInSection:(NSInteger)section 

NSString *sectionNameString = @"Current Jobs";
return sectionNameString;

在我的 iPhone 上输入此内容,但它的外观大致如此。在类范围之外使用字符串比较函数,如下所示:

NSInteger sortCitiesByName(City *city1, City *city2, void *context) 
NSString *name1 = [city1 name];
NSString *name2 = [city2 name];
return [name1 localizedCaseInsensitiveCompare: name2];

然后像这样对数组进行排序:

citiesArray = [citiesArray sortedArrayUsingFunction:sortCitiesByName context:nil];

【讨论】:

我想按字母顺序排列数组 为此,您将在您的城市数组上使用类似的内容: - (NSArray)sortedArrayUsingSelector:(SEL)comparator;或 - (NSArray *)sortedArrayUsingFunction:(NSInteger ()(ObjectType, ObjectType, void * __nullable)) 它会给我吗?

以上是关于从 JSON 数据填充 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

获取 JSON 数据以从数组中填充 TableView

使用从服务器接收到的 json 数据填充 html div

如何从 jquery 中的 json 格式对象填充 html 数据表

从 json 填充选择器,SwiftUI

从 JSON 数据的嵌套表单数组填充表单控件中的值

ExtJs:从 Json 响应中填充 ComboBox