在表格视图中点击单元格时推送新视图
Posted
技术标签:
【中文标题】在表格视图中点击单元格时推送新视图【英文标题】:Push a new view when a cell is tapped in Table View 【发布时间】:2011-04-06 19:11:37 【问题描述】:大家好, 我有一个已填充 21 个数据的表视图:
- (void)viewDidLoad
self.title = NSLocalizedString(@"Glossary", @"Back");
NSMutableArray *array = [[NSArray alloc] initWithObjects:@"Title", @"Meta Description Tag", @"Meta Keywords", @"Headings", @"Images", @"Frames", @"Flash Contents", @"Charset", @"Favicon", @"W3C Compatibility", @"Page Rank", @"Alexa Rank", @"Indexed Pages", @"Latest Date Cached By Google", @"Backlinks", @"Dmoz Listing", @"Server Info", @"IP", @"Location", @"Server Type", @"Registrar Info", nil];
self.glossaryArray = array;
[array release];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
// Return the number of sections.
return 4;
// Category
- (NSString *)tableView:(UITableView *)tableView
titleForHeaderInSection:(NSInteger)section
if (section == 0) return @"In-Site SEO";
if (section == 1) return @"Inside Analysis";
if (section == 2) return @"Ranks N Stuff";
if (section == 3) return @"Server Info";
return @"Other";
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
// Return the number of rows in the section.
if (section == 0) return 7;
if (section == 1) return 3;
if (section == 2) return 6;
if (section == 3) return 5;
return 0;
// Customize the appearance of table view cells.
- (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] autorelease];
// Configure the cell...
NSUInteger row = [indexPath row];
if ( indexPath.section == 1 ) row += 7;
if ( indexPath.section == 2 ) row += 10;
if ( indexPath.section == 3 ) row += 16;
if ( indexPath.section == 4 ) row += 21;
cell.textLabel.text = [glossaryArray objectAtIndex:row];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
Now this is the code I used to pussh a new view when a cell is tapped:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
NSInteger row = [indexPath row];
if (self.glossaryDetailViewController == nil)
GlossaryDetailViewController *aGlossaryDetail = [[GlossaryDetailViewController alloc] initWithNibName:@"GlossaryDetailViewController" bundle:nil];
self.glossaryDetailViewController = aGlossaryDetail;
[aGlossaryDetail release];
glossaryDetailViewController.title = [NSString stringWithFormat:@"%@", [glossaryArray objectAtIndex:row]];
NewReferencemoi_caAppDelegate *delegate = (NewReferencemoi_caAppDelegate *)[[UIApplication sharedApplication] delegate];
[delegate.glossaryNavController pushViewController:glossaryDetailViewController animated:YES];
这段代码运行良好,但问题是我的表格视图中的每一个和所有 21 个元素都打开了我创建的同一个 nib 文件。基本上,我想为我的 21 个元素中的每一个创建 1 个 UIViewController,每个元素都有自己的元素描述,而不仅仅是为我的表格视图中的所有元素使用 1 个 UIViewController,并且当每个元素被点击时,每个元素都打开自己的看法。显然,我不知道如何在这部分编码,所以我希望有人能帮助我完成我的 iPhone 项目的这一部分,谢谢
【问题讨论】:
您应该编辑旧问题,而不是打开具有相同目标的新问题。 【参考方案1】:请不要为了显示不同的项目而创建 21 个不同的视图控制器。而是在 GlossaryDetailViewController
上设置一个属性,该属性包含您的数据模型项的实例。
考虑一下...
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
NSInteger row = [indexPath row];
if (self.glossaryDetailViewController == nil)
GlossaryDetailViewController *aGlossaryDetail = [[GlossaryDetailViewController alloc] initWithNibName:@"GlossaryDetailViewController" bundle:nil];
self.glossaryDetailViewController = aGlossaryDetail;
[aGlossaryDetail release];
glossaryDetailViewController.glossaryDetailItem = [glossaryArray objectAtIndex:row];
[self.navigationController pushViewController:self.glossaryDetailViewController animated:YES];
使用这种方法使GlossaryDetailViewController
负责设置它自己的数据。
编辑
您还会注意到我删除了对应用委托的引用。您不需要它来访问导航控制器。导航控制器堆栈中的每个视图控制器都有对其的引用。虽然我将您的代码彻底拆开,但我还将通过覆盖 glossaryDetailViewController
的 getter 来排除视图控制器的创建,如下所示:
- (GlossaryDetailViewController *)glossaryDetailViewController
if (!glossaryDetailViewController)
glossaryDetailViewController = [[GlossaryDetailViewController alloc] init];
return glossaryDetailViewController;
如果你走这条路,你可以删除if
语句,只需调用self.glossaryDetailViewController
。
【讨论】:
嘿,谢谢,您是否有一个如何为每个单元格保存数据实例的示例?谢谢 当然,您将 NSObject 子类化以创建一个对象,该对象将保存您将在glossaryDetailViewController
上显示的所有相关数据。然后,您将创建您的 glossaryArray
来保存这些对象,而不是像现在这样保存 NSStrings。此外,您将添加 glossaryDetailItem
作为具有相同类型的 glossaryDetailViewController
的属性。
哇,谢谢,现在我正在使用此代码,我遇到了一个小问题,我收到了 glossaryDetailViewController.glossaryDetailItem = [glossaryArray objectAtIndex:row];
错误,因为它说:错误:请求成员 'aGlossaryDetail' 不是结构或联合。有任何想法吗?谢谢
把你现在拥有的东西放到一个新的问题中。我需要查看更多代码才能了解这里发生了什么。以上是关于在表格视图中点击单元格时推送新视图的主要内容,如果未能解决你的问题,请参考以下文章
在每个单元格都包含表格视图的表格视图中选择新单元格时,无法取消选择先前选择的单元格