在iPhone表格视图之间共享数据?

时间:2012-01-13 03:11:03

标签: iphone objective-c uitableview

我希望能够在我正在制作的应用的表格视图之间共享数据。这样做的原因是我希望能够告诉子视图选择了哪个表行,这样我就不必制作一堆视图,我可以测试一下整数变量是什么。我观看了有关如何执行此操作的视频教程,但他们没有使用tableviews。所以,当我尝试这个时,似乎没有用。我使用app委托作为“数据中心”来保存变量,然后我尝试在didSelectRowAtIndexPath方法中为变量赋值。 (通过它只是共享应用程序的方式推动新视图工作正常) 这是第一个tableview的代码,我将变量分配给一个数字。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSUInteger row = [indexPath row];
    ApplicationAppDelegate *appDelegate = (ApplicationAppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.rowPicked = row;
    SecondLevelViewController *nextController = [self.controllers objectAtIndex:row];
    [self.navigationController pushViewController:nextController animated:YES];
}

在app委托中我做了这个并且我在.m文件中合成了它:

   @property (nonatomic) NSInteger rowPicked;

和我需要的其他NSIntegers一样。 有什么建议?如果您认为我这样做完全错了,请您通过具体说明或链接到网站或视频教程来启发我吗? 谢谢大家!

2 个答案:

答案 0 :(得分:1)

以下是我通常如何做到这一点:

  • 我没有使用AppDelegate。列表和细节的逻辑和模型数据应该存在于有意义的类中。在这种情况下,我们将使用列表和详细信息视图控制器类本身。
  • 我将首先为列表视图的行创建一个UITableViewCell sublcass。在那个sublcass中,我将创建一个容纳“实体”的ivar或者单元格显示其信息所需的任何数据。这可以是NSManagedObject甚至是NSDictionary
  • 我将覆盖该ivar的setter,以便在UITableViewCell上设置数据时,它会更新单元出口以正确显示它。请注意我如何保持单元格如何完全包含在子类中的逻辑。在整个应用程序中执行此类操作以促进代码清洁和组织非常重要。
  • 在您的tableView:didSelectRowAtIndexPath方法中,您将调用UITableView类“cellForRowAtIndexPath:方法”以返回所选的单元格。然后,您可以将其强制转换为UITableViewCell子类,并获取您之前设置的实体信息。
  • 接下来,您需要在详细视图控制器中创建一个ivar。在将详细信息视图推入堆栈之前,您需要从tableView:didSelectRowAtIndexPath:方法设置此变量。
  • 您现在应该在详细信息视图控制器sublcass中拥有必要的数据,以便进行处理,查询等等。

希望这有帮助!

答案 1 :(得分:0)

它真的很糟糕。更好的是将id<$YOUR_PROTOCOL> delegate添加到SecondLevelViewcontroller并设置nextController.delegate = self。 协议看起来像

@protocol RowAccessProtocol
@optional
-(NSUInteger)selectedRow;
@end

必须创建当前的tableViewController:

@protocol RowAccessProtocol;
@class FirstLevelTableViewController:UITableViewController<RowAccessProtocol>
…
@end

并实施:

…
-(NSUInteger)selectedRow{
return [self.tableView indexPathForSelectedRow].row;
}

在SecondLevelViewController中,您可以调用[self.delegate selectedRow]来获取所选行。