UITableView - 如何从一个项目的视图直接移动到另一个项目?

时间:2011-05-19 09:34:40

标签: iphone cocoa-touch uitableview uinavigationcontroller nsfetchedresultscontroller

我的应用程序的一部分是笔记部分,有点像iPhone的内置笔记应用程序。用户在UITableView(由NSFetchedResultsController控制)中点击他们的笔记,UINavigationController显示笔记。

目前,如果用户想要查看另一个笔记,他们必须返回UITableView并在那里选择它。我想上下箭头直接进入下一个/上一个音符。

解决这个问题的最佳方式是什么?我猜我需要回去并以某种方式从NSFetchedResultsController获取下一个项目而不显示UITableView?我如何将其与UINavigationController集成?

2 个答案:

答案 0 :(得分:0)

我想出了一个相当混乱的解决方案。它只是作品,但我敢肯定必须有更优雅和简单的东西。无论如何,这就是我现在所做的工作。

首先,UITableView是笔记的UIViewController的委托。音符的UIViewController有一个名为“editingIndexPath”的属性,它是UITableView中音符的indexPath。当用户按下“上一个音符”按钮时,将调用以下方法:

- (void)backAction:(id)sender
{
    NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:editingIndexPath.row-1 inSection:editingIndexPath.section];
    [self.delegate editingViewControllerDidRequestObjectAtIndexPath:newIndexPath];     
}

然后tableViewController中的委托方法:

- (void)editingViewControllerDidRequestObjectAtIndexPath:(NSIndexPath *)indexPath
{
    [self.navigationController popViewControllerAnimated:NO];

    NoteEditViewController *detailViewController = [[NoteEditViewController alloc] init];
    [self.navigationController pushViewController:detailViewController animated:animated];

    Note *aNote = [self.fetchedResultsController objectAtIndexPath:indexPath];    
    detailViewController.noteTextView.text = aNote.text;
    detailViewController.editingIndexPath = indexPath;
    detailViewController.delegate = self;
    [detailViewController release];
}

这是有效的,但它相当不优雅,并且总是会产生“弹出”动画(从右到左),无论是下一个音符还是前一个音符。我也用一些核心动画捏造了这个,但我确信我错过了一个更简单,更好的方法。

答案 1 :(得分:0)

事实证明答案非常简单 - 我根本不需要改变观点。我只是使用委托从根视图控制器获取新信息并更改了当前视图控制器上的所有属性。其中一个属性是NSIndexPath,因此它知道它出现在根视图表中的哪个位置。