如何在ios中使用NSDictionary将两个NSArray对象显示为UITableview的部分[重复]

Posted

技术标签:

【中文标题】如何在ios中使用NSDictionary将两个NSArray对象显示为UITableview的部分[重复]【英文标题】:How to display two NSArray objects as sections of UITableview using NSDictionary in ios [duplicate] 【发布时间】:2016-01-07 11:14:29 【问题描述】:

这是我的代码 视图控制器.m


    NSArray *sectionTitleArray;


@property (strong, nonatomic) IBOutlet UITableView *tablevw;

- (void)viewDidLoad

    [super viewDidLoad];

    _tablevw.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

    _tablevw.delegate = self;
    _tablevw.dataSource = self;

    sectionTitleArray = @[ @ @"description": @"About Step0ne",
                              @"About Stepone": @[ @ @"text": @"Step0ne 1" ,
                                              @ @"text": @"Step0ne 2" ,
                                              @ @"text": @"Step0ne 3" ,
                                              @ @"text": @"Step0ne 4" ,
                                              @ @"text": @"Step0ne 5" ,
                                              @ @"text": @"Step0ne 6" ,
                                              @ @"text": @"Step0ne 7" ,
                                              @ @"text": @"Step0ne 8" ,
                                              ]
                              ,
                           @ @"description": @"Profile",
                              @"profile": @[ @ @"text": @"profile 1" ,
                                              @ @"text": @"profile 2" ,
                                              @ @"text": @"profile 3" ,
                                              @ @"text": @"profile 4" ,
                                              @ @"text": @"profile 5" ,
                                              @ @"text": @"profile 6" ,
                                              @ @"text": @"profile 7" ,
                                              @ @"text": @"profile 8" ,
                                              ]
                              ,

                              ];


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

    return 1;


-(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];
    

    cell.textLabel.text = [[sectionTitleArray objectAtIndex:indexPath.section]objectForKey:@"About Stepone"];
    cell.textLabel.text = [[sectionTitleArray objectAtIndex:indexPath.section]objectForKey:@"Profile"];

    return cell;

About SteponeProfile 是我的tableview 的两个部分。而stepone1,stepone2,....stepone8 应该是关于Stepone 部分的行。

【问题讨论】:

您必须实现 numberofSection 委托方法。在该方法中返回 yourArry.count。并且要添加部分标题,您必须从委托方法向每个部分添加标题。即viewforheaderinsection。 是的,我补充说仍然没有得到任何帮助 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView return sectionTitleArray.count; - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section UIView *sectionView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 280,40)]; sectionView.tag=部分; UILabel *viewLabel=[[UILabel alloc]initWithFrame:CGRectMake(13, 0, _tablevw.frame.size.width-10, 40)]; viewLabel.text=[sectionTitleArray objectAtIndex:section]; NSDictionary *sectionData = [sectionTitleArray objectAtIndex:section]; viewLabel.text = [sectionData objectForKey:@"description"]; [sectionView addSubview:viewLabel];返回截面视图; 【参考方案1】:

这里有一些久经考验的代码供您参考。 为了方便起见,我对您的数据结构进行了一些更改。希望你觉得这很有帮助。


    NSDictionary *_objects;


- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    _objects = @@"About Stepone": @[ @ @"text": @"Step0ne 1" ,
                                      @ @"text": @"Step0ne 2" ,
                                      @ @"text": @"Step0ne 3" ,
                                      @ @"text": @"Step0ne 4" ,
                                      @ @"text": @"Step0ne 5" ,
                                      @ @"text": @"Step0ne 6" ,
                                      @ @"text": @"Step0ne 7" ,
                                      @ @"text": @"Step0ne 8" ],
                 @"profile": @[ @ @"text": @"profile 1" ,
                                @ @"text": @"profile 2" ,
                                @ @"text": @"profile 3" ,
                                @ @"text": @"profile 4" ,
                                @ @"text": @"profile 5" ,
                                @ @"text": @"profile 6" ,
                                @ @"text": @"profile 7" ,
                                @ @"text": @"profile 8" ]
                 ;




- (void)viewWillAppear:(BOOL)animated 
    [super viewWillAppear:animated];


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


#pragma mark - Table View

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    return _objects.allKeys.count;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    return ((NSArray *) _objects[_objects.allKeys[section]]).count;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    NSDictionary *object = _objects[_objects.allKeys[indexPath.section]][indexPath.row];
    cell.textLabel.text = object[@"text"];
    return cell;


- (NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
    return _objects.allKeys[section];

快乐编码。

输出如下:

【讨论】:

我在我的代码中实现了我们的代码。由于在 NSArray 类型的对象上找不到 allkeys 出现错误。我声明为 @property NSArray *allKeys; 为了方便起见,请检查我是否对您的数据结构进行了一些更新。我在回答中将行(指定)加粗。 是的,我只使用了您更新的数据结构。请您建议您在代码中声明 allkeys 的位置先生。 这里的_objects NSDictionary(从它的声明中可以看出)。而allkeys NSDictionary 的财产。我再次编辑了答案以使其更加清晰。 让我们continue this discussion in chat。【参考方案2】:

试试这个...

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

     - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
          if (section==0)
          
                 return [array1 count];
          
          else
                 return [array2 count];
          
     

     - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
          if(section == 0)
               return @"Section 1";
          else
               return @"Section 2";
     


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

          static NSString *CellIdentifier = @"Cell";

          UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
         if (cell == nil) 
          cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
          

     if (indexPath.section==0) 
         ObjectData *theCellData = [array1 objectAtIndex:indexPath.row];
         NSString *cellValue =theCellData.category;
         cell.textLabel.text = cellValue;
     
     else 
         ObjectData *theCellData = [array2 objectAtIndex:indexPath.row];
         NSString *cellValue =theCellData.category;
         cell.textLabel.text = cellValue;
     
         return cell;    

【讨论】:

【参考方案3】:

我想你错过了这行代码..

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    return sectionTitleArray.count;

【讨论】:

【参考方案4】:

您可以通过以下代码使用它:

对于节号,您必须在 numberOfSectionsInTableView 委托方法中返回数组的计数。

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    return sectionTitleArray.count;// Total number of sections in the tableview.

【讨论】:

【参考方案5】:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    // Return the number of sections.
    return sectionTitleArray.count;


--before your returning change both key names as same.
like for exampel profile and stepone should be same key

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

    return [[[sectionTitleArray objectAtIndex:section]valueForKey:@"About Stepone"]count];

【讨论】:

【参考方案6】:

在委托方法下实现

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView


    return sectionTitleArray.count;

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

    NSDictionary *dict=[sectionTitleArray objectAtIndex:section];

    return dict[@"description"];

你需要返回如下行数而不是1

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

    NSDictionary *dict=[sectionTitleArray objectAtIndex:section];

    NSArray *array=dict[dict[@"description"]];

    return array.count;

【讨论】:

【参考方案7】:

要向表格视图添加多个部分,请使用委托方法numberOfSectionsInTableView

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    // Return the number of sections.
    return sectionTitleArray.count;

要显示特定的行数,请使用此委托:

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

    NSDictionary *dict = [sectionTitleArray ObjectAtIndex:section]
    NSString *strSection = [[dict allKeys] objectAtIndex:2];
    NSArray *rows= [dict ObjectForKey:strSection];
    return rows.count;

【讨论】:

以上是关于如何在ios中使用NSDictionary将两个NSArray对象显示为UITableview的部分[重复]的主要内容,如果未能解决你的问题,请参考以下文章

IOS开发之——objectForKey与valueForKey在NSDictionary中的差异

iOS 使用 NSDictionary 将数据加载到部分和行中

如何在序列化为 json 之前将 NSDictionary 添加到另一个 NSDictionary

在 Push for Segue [IOS] 中获取 NSDictionary 选定行

从 uitableview 将数据存储在 nsdictionary 中

如何将 NSCFArray(可能的 JSON)序列化为 NSDictionary?