UITableView 分组数组
Posted
技术标签:
【中文标题】UITableView 分组数组【英文标题】:UITableView Grouped Arrays 【发布时间】:2013-09-08 16:59:34 【问题描述】:我似乎无法从逻辑上弄清楚如何为每个分组部分设置一个单独的数组,这些部分将在导航控制器的详细视图中显示不同的数据。对于每个组,都有不同的数据,但第二个视图当前在 UILabel 中显示来自一个数组的数据,并从每个组的数组开头开始。如果您需要更多信息,请告诉我。
- (void)viewDidLoad
[super viewDidLoad];
//Keeping of Business Names for Detailed View
addressBook=@[@"Clinic 1 Business",@"Clinic 2 Business",@"Clinic 3 Business"];
//holding of clinic names per county
adams=@[@"Clinic 1 Business Listing",@"Clinic 2 Business Listing",@"eeeee"];
allegheny=@[@"Clinic 3 Business Listing",@"Clinic 4 Business Listing"];
armstrong=@[@"Clinic 5 Business Listing",@"Clinic 6 Business Listing",@"Clinic 7 Business Listing"];
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
NSLog(@"this is the content of addressBook: \n %@", addressBook);
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
// Return the number of sections.
return 3;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
// Return the number of rows in the section.
//return addressBook.count;
if(section==0)
return [adams count];
else if(section==1)
return [allegheny count];
else if (section==2)
return [armstrong count];
/*
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
return [NSArray arrayWithObjects:@"Rec", @"A", @"B", nil ];
*/
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"abCell";
addressBookCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if(indexPath.section==0)
cell.addressBookLbl.text=[adams objectAtIndex:indexPath.row];
else if(indexPath.section==1)
cell.addressBookLbl.text=[allegheny objectAtIndex:indexPath.row];
else if (indexPath.section==2)
cell.addressBookLbl.text=[armstrong objectAtIndex:indexPath.row];
return cell;
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([[segue identifier]isEqualToString:@"addressBookDetails"])
addressBookDetailsViewController *addressDetailsController = [segue destinationViewController];
NSIndexPath *abIndexPath = [self.tableView indexPathForSelectedRow];
int row = [abIndexPath row];
addressDetailsController.addressDetail=@[addressBook[row]];
NSLog(@"this is the content of addressBook: \n %@", addressBook);
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
if (section==0)
return @"Adams County";
else if(section==1)
return @"Allegheny County";
else if(section==2)
return @"Armstrong County";
【问题讨论】:
不确定您要达到的目标。你解释了问题,但不是理想的场景。 理想的目标是在表中每个部分的详细视图中显示不同的数据。didSelectRowAtIndexPath
中有什么内容?
没什么,我不知道该怎么办。
:O.好吧,我的朋友,你将如何传递你的数据!你怎么称呼addressBookDetails segue?它是否连接到原型单元?
【参考方案1】:
您传递数据的方式是使用 segue,这就是您正在做的事情。您没有正确做的事情是在 prepareForSegue
方法中。为简化起见,请使用 didSelectRowAtIndexPath
方法,这样您就不会创建自己的方式来查找选定的单元格。
要处理这个问题,您必须在didSelectRowAtIndexPath
中添加一些内容。以下是您需要做的:
:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
你的方法应该是这样的:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"addressBookDetails"])
addressBookDetailsViewController *addressDetailsController = [segue destinationViewController];
addressDetailsController.addressDetail = selectedAddressBook;
//selectedAddressBook is an array that you don't have yet, but will create in the next step
//Make sure that the addressDetail in the DetailViewController is an Array, and not something else
现在您要创建数组selectedAddressBook
。所以在标题中(我们仍然在 MasterViewController 中):
@interface //blah blah blah
NSArray *selectedAddressBook;
好的,现在回到实现文件(仍然是 MasterViewController)。现在你要使用didSelectRowAtIndexPath
方法(我会在最后解释这个的重要性)。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
//some animation to fade away the blue on selection
[tableView deselectRowAtIndexPath:indexPath animated:YES];
//here you will populate the array that you created
selectedAddressBook = (NSArray *)addressBook[indexPath.row];
//now you perform your segue
[self performSegueWithIdentifier:@"addressBookDetails" sender:self];
如果您现在尝试运行它,它可能会崩溃。删除现有的转场。只需删除它。在 MasterViewController 本身和 DetailViewController 之间创建一个新的 segue。选择您想要的任何类型,但您可能应该使用Replace
segue。为该 segue 提供与您刚刚删除的标识符相同的标识符。
现在,在 DetailViewController .m 文件中放置一个 NSLog 以查看 viewDidLoad
中的数据:
- (void)viewDidLoad
[super viewDidLoad];
NSLog(@"Did the array get passed along? Let's see :\n %@", addressDetail);
//addressDetail should be the name of the array in this VC
如果一切顺利,则日志应仅显示所选行的详细信息。现在,在 DetailViewController 中,您可以访问数组中的数据并根据需要显示它。
在使用 tableView 时需要使用 didSelectRowAtIndexPath
方法,实际上只是因为它让生活变得简单。此方法通过使用 NSIndexPath 识别选择的行。这消除了您在 prepareForSegue
方法中观看它的方式。 它告诉代理指定的行现在已被选中。使用它,您可以有选择地对单元格点击执行操作。
【讨论】:
你如何“替换”segue? @Klinetel,“替换”segue 是一种 segue 类型。删除当前一个 Ctrl+click 拖动到下一个视图,会弹出一个窗口。选择“替换”。 不走运,我不明白你的意思。我什至在谷歌上也找不到答案。 我在没有替换 segue 的情况下完全按照您的解释进行了尝试(刚刚创建了一个新的),现在当我选择表格行时它崩溃了...... 你使用了哪个 segue 以及崩溃说@Klinetel 是什么意思?【参考方案2】:我对您尝试对上面的 addressBook
数组执行的操作感到有些困惑。其余的,看起来你应该使用字典。你熟悉字典吗?您可以将键设置为县,并将值设置为该县的数组。然后当你要求numberOfSectionsInTableView
你return [myDictionary allKeys].count
让我知道这是否有意义。如果没有,我会进一步详细说明。另外,请描述addressBook
的用途。
【讨论】:
我对字典不太熟悉。请进一步解释。 addressBook 只是一个数组,用于保存要在详细视图中显示的企业名称。 你应该使用 NSDictionnary(如果你喜欢哈希表:hashtable) 我不知道如何用字典来实现。以上是关于UITableView 分组数组的主要内容,如果未能解决你的问题,请参考以下文章
用于uitableview分组的多个数组中的objective-c溢出数组