【问题标题】:How to transition from UITableViewCell to another view controller如何从 UITableViewCell 转换到另一个视图控制器
【发布时间】:2014-03-22 21:51:35
【问题描述】:

我正在尝试从带有原型单元格的 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;
}

没有发生的是从表格到细节的过渡我有一个从原型单元到细节的推送。

我错过了什么?

【问题讨论】:

    标签: ios objective-c uitableview uistoryboardsegue


    【解决方案1】:

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

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

    这将使用您在情节提要中定义的转场。其中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];
    }
    

    【讨论】:

    • 为所选项目创建属性是一种简单/正确的存储方式吗?
    • @user3431724 在我的答案中添加了更多内容,请参阅 EDIT 2
    • @user3431724 一个属性可以正常工作,但是如果它只被这个类访问/使用(忽略传递),没有必要,我展示的编辑是如何创建一个私有变量.在这种情况下更有意义
    • 关于我的代码在我的代码的另一部分中似乎有点奇怪,我使用 segue 传递值,但如果没有 alloc 和 init 首先它不起作用,因为(我认为如果我错了,请纠正我)你不能写除非它已被创建并且它将在 viewDidLoad 中创建,但由于延迟加载协议调用尚未加载该视图,因此我们必须在 segue 中创建它然后分配值我会将其更改为私有但我仍然没有得到继续工作
    • @user3431724 我在 EDIT 3 中将您的代码编辑为我的答案。你没有调用 segue,这是我发布的第一行代码。不,我很抱歉,这根本不正确。所有对象都是指针。您正在做的是创建一个对象并将其内存位置传递给另一个指针。第二个指针是指向内存位置还是 nil,与传递数据无关。最终的结果是完全一样的。首先创建它只是浪费处理
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多