3

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

到目前为止,我的方法如下所示:

 - (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 连接到情节提要中的标签)是空白的。

如果这看起来很熟悉,那是因为我正在遵循以下教程,但尝试添加我自己的东西。非常感谢! 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 中调用的,还是我忽略了该方法?

4

3 回答 3

4

如果您使用情节提要,那么很可能您不会看到对-tableView:didSelectRowAtIndexPath:. 如果您使用 segues 进入下一个视图,那么您将需要使用-prepareForSegue:sender:see: 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 有一个 player 属性。

希望有帮助。

于 2012-08-01T20:17:59.363 回答
0

在您的下一个视图 controller.h 中,您需要一个 player 属性。

@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];
}

明白这个概念吗?

于 2012-08-01T20:20:07.470 回答
0

由于您使用笔尖进行初始化,因此我假设您没有使用情节提要....

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

于 2012-08-01T20:20:13.920 回答