尝试在标签栏控制器中将数据从一个视图控制器传递到另一个视图控制器

时间:2011-06-27 18:27:42

标签: iphone objective-c

所以我正在尝试创建一组最近查看的图片。基本上我有一个TableViewController在导航控制器中推送一个图片视图,位于一个标签中,然后我试图让一个导航控制器记录最近查看过的图片,将它们列在TableViewController中然后还将其推送到显示图片的新视图。我以编程方式在标签栏控制器中设置了两个导航控制器。几乎所有内容都按照我想要的方式设置,但我无法将最近查看的图片信息传递给将显示列表的表视图控制器。

以下是我在用户点击特定表格单元格时尝试传递数据的方法:

(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
      RecentsTableViewController *rtvc = [[RecentsTableViewController alloc] init];
      [rtvc.recents addObject:[self dictionaryAtIndex:indexPath]];
      [rtvc release];

}

recents是我在RecentsTableViewController.中创建的可变数组它正在初始化好,使用NSLog,检查但是每次用户点击另一个视图控制器中的表格单元格时,字典就是没有传递给数组。我也知道字典信息是正确的并且设置正确,因为它可以传递到显示图像的视图。我想我很困惑,因为我可以为NavigationController做这件事,我只是在TabBarController.

中传递数据时难以找到答案

很抱歉,如果这篇文章可能很长/令人困惑,但我真的到处找了一个没有运气的答案。我听说使用app delegate存储就像一个全局变量,但我认为这是不好的做法,我正在尝试正确编写我的代码。

以下是dictionaryAtIndex方法的更新代码:

- (NSDictionary *)dictionaryAtIndex:(NSIndexPath *)indexPath {

    NSArray *flickrPics = [FlickrFetcher photosAtPlace:self.placeID];
    NSDictionary *returnedDictionary = [flickrPics objectAtIndex:indexPath.row];
    return returnedDictionary;

}

2 个答案:

答案 0 :(得分:0)

indexPath is a struct包含两个属性:row和index,不能直接用于访问数组中的对象。你可能想要这样做:

[rtvc.recents updateRecents:[self dictionaryAtIndex:indexPath.row]];

答案 1 :(得分:0)

您正在创建 new RecentsTableViewController(它与标签栏中的不一样),设置其“最近的项目”,然后将其释放。没有其他东西有指针,所以没有别的东西会看到它的“最近”项目。

至少有三种简单方法可以更新“最近”控制器:

  • 直接从标签栏控制器访问它(当您更改标签顺序或导航结构或......时,会出现令人难以置信的分层违规和中断):[(RecentsTableViewController*)[self.tabBarController.viewControllers objectAtIndex:...]) updateRecentsWithDictionary:...]
  • 发布您在RecentsTableViewController中监听的通知:[[NSNotificationCenter defaultCenter] postNotificationWithName:MyViewedPictureNotificationName object:nil userInfo:...]
  • 将其保存到NSUserDefaults。从-[RecentsTableViewController viewWillAppear:]中的NSUserDefaults加载它。这里的优点是它可以在应用程序启动时持续存在。 (隐含的假设是,当“最近”视图可见时,默认值不会改变。)。