如何从UITableViewCell转换到另一个视图控制器

时间:2014-03-21 14:07:32

标签: ios objective-c uitableview uistoryboardsegue

我正试图从带有原型单元格的UITableView转到我选择的项目的detailviewcontroller

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"historyToDetail"])
    {
        BYFHistoryDetailViewController *controller = (BYFHistoryDetailViewController    *)segue.destinationViewController;
        controller.workOut = [[BYFWorkOut alloc] init];
        controller.workOut=_selectRow;
    }
}


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    BYFHistoryTableViewController *detailViewController =[[BYFHistoryTableViewController alloc] init];

    NSArray *items = [[BYFworkOutStore sharedStore] allItems];
    BYFWorkOut *selectedItem = items[indexPath.row];
    _selectRow = selectedItem;
}

没有发生的事情是从表格到细节的过渡我从原型单元到细节都有推动。

我错过了什么?

2 个答案:

答案 0 :(得分:2)

你在这里犯了很多错误。使用segue时,您不会创建该类的实例。你只需致电:

[self performSegueWithIdentifier:@"MySegue" sender:self];

这将使用您在故事板中定义的segue。其中MySegue是您创建的segue ID。

如果要传入数据,请使用回调

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    BYFHistoryDetailViewController *vc = (BYFHistoryDetailViewController *)[segue destinationViewController];
    vc.workOut = selectedItem;
}

但是使用此回调意味着您需要在点击该行后将selectedItem存储在某处,以便您可以在此处访问它。

修改

你的代码在这里看起来有点奇怪。

您将锻炼设置为新对象。

detailViewController.workOut = [[BYFWorkOut alloc]init];

从数据创建另一个对象。

NSArray *items = [[BYFworkOutStore sharedStore] allItems];
BYFWorkOut *selectedItem = items[indexPath.row];

然后分配新对象,覆盖前一个对象。

//give detail view controller a pointer to the item object in row
detailViewController.workOut = selectedItem;

根本不需要第一行代码

编辑2

如果您一次只使用一个所选项目。您可以在UITableViewController课程中执行此操作。

@implementation MyTableViewControllerClass
{
    BYFWorkOut *_selectedItem;
}

didSelectRowAtIndexPath内:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   NSArray *items = [[BYFworkOutStore sharedStore] allItems];
   _selectedItem = items[indexPath.row];
}


编辑3

我修改了你在这里发布的代码。您没有添加我发布的第一行代码。请看这个:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"historyToDetail"])
    {
        BYFHistoryDetailViewController *controller = (BYFHistoryDetailViewController    *)segue.destinationViewController;
        controller.workOut = _selectRow;
    }
}


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSArray *items = [[BYFworkOutStore sharedStore] allItems];
    _selectRow = items[indexPath.row];

   [self performSegueWithIdentifier:@"historyToDetail" sender:self];
}

答案 1 :(得分:-1)

您需要命名您的segue并调用方法:

[self performSegueWithIdentifier:@"MySegue" sender:self];