在“UITableView”中选择行时调用新视图
Posted
技术标签:
【中文标题】在“UITableView”中选择行时调用新视图【英文标题】:Calling a New View when selecting a Row in a 'UITableView' 【发布时间】:2011-04-20 00:30:11 【问题描述】:我目前正在编写我的第一个 iPhone 应用程序,但遇到了问题。我有一个包含 UITableView 的视图。这是我第一次尝试这样做,这是我想要实现的行为:
当用户选择其中一行时,我希望它调用一个新视图,将用户带到另一个页面,显示与他们选择的内容相关的信息。
我目前拥有它,因此当用户选择一行时,它会在同一视图中显示 UIAlert,但这不适合我的需要。我已经通过界面生成器设置了 UITableView,并将以下代码输入到我的 .m 文件中进行设置。
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
//return the value
return 10;
//now we define the cells.
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
// Identifier for retrieving reusable cells.
static NSString *cellIdentifier = @"MyCellIdentifier";
// Attempt to request the reusable cell.
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
// No cell available - create one
if(cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:cellIdentifier];
// Set the text of the cell to the row index.
cell.textLabel.text = [NSString stringWithFormat:@"iPad %d", indexPath.row];
return cell;
这将创建一个包含十行的列表。以下代码在点击时为我提供了 UIAlert,但是,我想删除它并使其调用我选择的新视图;
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
// Show an alert with the index selected.
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"iPad Selected"
message:[NSString stringWithFormat:@"iPad %d", indexPath.row]
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
任何人都可以帮助完成最后一段代码吗?我希望它调用的视图称为“ProteinView”。
【问题讨论】:
【参考方案1】:好的,我们需要做的是使用我们已经很容易使用的 UITableView 方法之一。我们将执行以下操作。
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
ProteinView *detailViewController = [[ProteinView alloc] initWithNibName:@"ProteinView" bundle:nil];
// It is here we'd pass information from the currently selected UITableViewCell to the ProteinView.
// An example of this is the following.
// I would do it like this, but others would differ slightly.
NSString *titleString = [[[NSString alloc] initWithFormat:@"iPad %d",indexPath.row] autorelease];
// title is an object of detailViewController (ProteinView). In my own instances, I have always made a NSString which in viewDiDLoad is made the self.navigationBar.title string. Look below for what my ProteinView.m and .h would look like.
detailViewController.stringTitle = titleString;
// ...
// Pass the selected object to the new view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
编辑
// -------- ProteinView.m -------- //
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
// Here we set the navigationItem.title to the stringTitle. stringTitle is declared in the .h. Think of it as a global scope variable. It is also propertised in the .h and then synthesized in the .m of ProteinView.
self.navigationItem.title = stringTitle;
我还没有编译这个,所以我不知道它是否会完全工作。但这绝对是最快、最简单的方法!
【讨论】:
这是一个正确的答案,但是 (a) 假设 OP 正在使用导航视图控制器,并且 (b) 并没有真正解释所涉及的不同部分 - 新视图控制器、XIB、和title
属性。可以详细说明一下吗?
我用过那个例子,编译过等,UIToolBar 显示很好。但是当点击一行时,应用程序崩溃。 #沮丧!
它似乎基于 [NSString withFormat: 一段代码给出了警告。如果有人仍在阅读此内容,请查看屏幕截图:-) - d.pr/AKNb
应该是 [NSString stringWithFormat:@"iPad %d",indexPath.row];
@Mike,感谢您的评论,这当然有帮助。该应用程序不再在触摸一行时崩溃,但它仍然不会将我带到我的新“ProteinView” - 它只是突出显示该行并使其突出显示。不崩溃,不改变观点。只是停留在具有突出显示的行的同一视图上。【参考方案2】:
您可以像这样以模态方式呈现视图
YourViewController2 *viewController2 = [[YourViewController2 alloc]initWithNibName:@"YourViewController2" bundle:nil];
[self presentModalViewController:viewController2 animated:YES];
您是否有不止一种观点要呈现?如果是这样,您将需要使用名称创建一个数组,将其传递到 tableview 中,然后根据 indexPath.row 为所选行显示正确的视图。
【讨论】:
【参考方案3】:您必须打开 MainWindow.xib 并向其中添加导航控制器。然后将导航控制器插座添加到您的应用程序委托并连接它们。然后您需要将导航控制器的视图设置为主窗口的视图。
您可以相当轻松地向任何 iPhone 应用程序添加表格视图,只需从 File -> New 命令创建一个新的 UITableViewController 子类。
即使你走这条路,我还是建议创建一个新的基于导航的项目以用作模板/备忘单。
【讨论】:
迈克,迈克,迈克——这一切听起来都很棒,但是,你知道我真的不知道你在说什么哈哈。我刚读了你的推文,所以如果你有时间,你能整理一个小示例项目吗?我现在给你发邮件 大声笑,我知道这有点痛苦,但使用我发布的教程开始一个新项目。我知道您认为这很容易做到,但是尝试将额外的导航控制器添加到现有项目中可能会很棘手。如果您完成教程(第 1 部分和第 2 部分),您将大致了解您想要做什么,然后您可以将您知道的内容添加到您的项目中,或者将您的项目添加到示例教程中 确实,你是对的。我今晚会试一试,可能需要想一个新的方式来展示我想要展示的东西。谢谢大家以上是关于在“UITableView”中选择行时调用新视图的主要内容,如果未能解决你的问题,请参考以下文章
选择 UITableView 行时使用特定信息填充 UITextView
从 UITableView 选择行时将核心数据对象传递给另一个视图控制器