在“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 中选择行时变量不更新

从 UITableView 选择行时将核心数据对象传递给另一个视图控制器

重新排序 UITableView 行时,详细视图未更新

Swift-app 在 UITableView 中选择行时崩溃

选择行时 UITableView 崩溃