如何使用“didSelectRowAtIndexPath:(NSIndexPath *)indexPath”方法

时间:2012-08-01 03:01:12

标签: objective-c xcode4 uiviewcontroller uitableview appdelegate

我的问题:当用户选择某个播放器时,我希望与该播放器相关的其他信息显示在新的视图控制器上

到目前为止,我的方法看起来像这样:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath   *)indexPath
{
IPlayerViewController *detailViewController = [[IPlayerViewController alloc] initWithNibName:@"IPlayerViewController.h" bundle:nil];
Player *playerF = [playerArray objectAtIndex:indexPath.row];
detailViewController.PlayerLabel.text=playerF.Name;

[self.navigationController pushViewController:detailViewController animated:YES];

}

然而,我在IPlayerViewController中创建的PlayerLabel(并将UILabel连接到storyboard中的标签)是空白的。

如果这看起来很熟悉,那是因为我遵循以下教程,但尝试添加自己的东西。非常感谢! http://www.raywenderlich.com/5138/beginning-storyboards-in-ios-5-part-1

编辑: 我正在使用故事板。但是,在预定义的方法中,xcode带有以下注释,用Nib Name初始化,这让我失望。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath   *)indexPath
{
   // Navigation logic may go here. Create and push another view controller.
/*
 <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
 // ...
 // Pass the selected object to the new view controller.
 [self.navigationController pushViewController:detailViewController animated:YES];
 */

}

所以我觉得应该使用prepareForSegue。这是我在didSelectRowAtIndexPath中调用的内容还是忽略了该方法?

3 个答案:

答案 0 :(得分:4)

如果您使用的是故事板,那么很可能您不会看到-tableView:didSelectRowAtIndexPath:的来电。如果您使用segues进入下一个视图,则需要使用-prepareForSegue:sender:,请参阅:How to pass prepareForSegue: an object


<强>更新

您是否有从表格视图单元格到详细视图控制器的segue?

如果你有一个segue,那么-tableView:didSelectRowAtIndexPath:就不是你想要的了。如果您有segue,请在表视图控制器中创建-prepareForSegue:sender:方法。它看起来像:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
    Player *player = [self.playerArray objectAtIndex:indexPath.row];

    IPlayerViewController *destination = segue.destinationViewController;
    destination.player = player;
}

当然假设IPlayerViewController有一个播放器属性。

希望有所帮助。

答案 1 :(得分:0)

在你的下一个视图controller.h中,你需要一个玩家属性。

@property (nonatomic,strong) Player *player;

如果您使用的是故事板,则必须在您的类中保存selectedRow索引,并实现prepareForSegue方法,如:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

  NextViewController *controller = segue.destinationViewController
  controller.player = [self.players objectAtIndex: YOUR_SAVED_INDEX];
}

理解这个概念?

答案 2 :(得分:0)

由于您正在使用笔尖启动,我会假设您使用故事板 ....

我认为你做的一切都是正确的,除了,不要试图直接将名字放入标签,因为它还没有加载。在详细信息控制器中创建一个属性,该属性只是一个用于保存名称的字符串。在didSelectRowAtIndexPath:的代码中设置 ,然后在详细信息控制器的viewDidLoad:中更新标签。