如何在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 Stepone
和Profile
是我的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 选定行