在2个控制器之间的数组中共享didSelectRowAtIndexPath选择

时间:2009-12-16 16:59:12

标签: uitableview nsmutablearray uitextview didselectrowatindexpath

在我永无止境的任务中,将表行选择共享到模态视图中加载的多个视图,我将其归结为一个问题。我使用Apples DrillDownSave示例代码作为模型来重现这种魔力。并且我认为我的设置完全一样......

在我的RootViewController.m的didSelectRowAtIndexPath部分中,我有以下代码将violinMakers MSMutableArray复制到同名的DetailsView MSMuteableArray。所有颜色编码,没有错误告诉我,我在正确的道路上......但是..

detailsView.violinMakers = [violinMakers objectAtIndex:indexPath.row];
在RootviewController.h文件中的

我引用了DetailsViewController:

@class DetailViewController

DetailsViewController *detailsView;
NSMutableArray *violinMakers; 
@property (nonatomic, retain) NSMutableArray *violinMakers;

然后在DetailsViewController .h文件中:

NSMutableArray *violinMakers;
IBOutlet UITextView *violinMakerDescription;
@property (nonatomic, retain) NSMutableArray *violinMakers; //tried assign or copy no difference
@property (nonatomic, retain) IBOutlet UITextView *violinMakerDescription;

在DetailsViewController .m文件中:

- (void)viewWillAppear:(BOOL)animated
ViolinMaker *violinMaker = (ViolinMaker *)violinMakers;
[violinMakerDescription setText: [violinMaker description]];
 NSLog(@"violinMakerDescription in detailsView: %@", [violinMaker description]);

我有一个单独的类,如上所示我用来定义数据violinMaker。这在didSelectRowAtIndexPath中的rootviewcontroller中工作正常,所以我知道这不是问题的一部分,我当然在.m文件中引用它。 它正常地连接在IB中,因为我通过简单地从rootViewController直接推送DetailsViewController来测试它,并且数据可以很好地加载到UITextView中。

我从RootviewController(tableViewColler)推送视图(完美工作)启动DetailsViewController,并通过以下方式启动Modal视图:

DetailsViewController *detailsViewController = [[DetailsViewController alloc] initWithNibName:@"DetailsViewController" bundle:nil ];
UINavigationController *aDetailsViewController = [[UINavigationController alloc] initWithRootViewController:detailsViewController];

[self presentModalViewController:aDetailsViewController animated:YES];

// [violinMakerView release];
[DetailsViewController retain]; // or release no different
[aDetailsViewController release];

我在构建和View Loads上没有错误,但textView中的信息是空白的。这也告诉我它没有加载任何东西,并正确连接......我非常接近......但我可以从我的NSLog看到它的值是:

violinMakerDescription in detailsView: (null)

所以来自RootviewController的violinMakers没有被复制到DetailsViewController中的violinMakers数组中。我讨厌承认它,但几周以来我尝试了各种解决方案,通过appDelegate,通过NSDictionary,以及各种其他方式无效。我认为答案是将violinMakers释放,然后只传递任何东西,或者RootViewController中的赋值行不起作用。有人知道我能改变什么吗?

我真的很感激一些帮助,我只是没有得到我所缺少的东西,但这是我得到的最接近我只需要正确的链接,或者看看为什么没有保留这些值。如果有办法检查值何时被释放,我可以检查这个问题,也许就是这样。我试图在任何地方保留它(并在我开始工作后更正)但它只是不起作用......帮助??

谢谢大家!!!

真诚的柯克

尝试将RootViewController中的加载线更改为:

[detailsView.violinMakers addObject: [violinMakers objectAtIndex:indexPath.row]];

@Frank 首先感谢您对此的帮助! 我以同样的方式在rootViewController中设置了violinMaker对象,它在那里工作正常,如下所示:

violinMaker = [self.violinMakers objectAtIndex:indexPath.row];

        ViolinMakerViewController *violinMakerViewController = [[ViolinMakerViewController alloc] initWithNibName:@"ViolinMakerViewController" bundle:nil];
        self.violinMakerView = violinMakerViewController;

        [[self navigationController] pushViewController:violinMakerView animated:YES];


        [self.violinMakerView.violinMakerName setText:[violinMaker name]];
    ....
        [self.violinMakerView.violinMakerDescription setText:[violinMaker description]];

        NSLog(@"violinMaker description variable in RootView: %@", [violinMaker description]);

        DetailsViewController.violinMakers = [violinMakers objectAtIndex:indexPath.row];

这里我在NSLog中看到它在这里加载正常,所以我相信在这里将它从objectAtIndex:indexPath.row加载到数组中,然后将该数组复制并从DetaisViewController将其放入ViolinMaker对象中。我不想在DetailsViewController中再次重新创建ViolinMaker对象,只需从数组中重新加载它就像从RootViewController那样重新加载它。

这是DrillDownSave Apple示例的用法,我已经镜像了这个配置。在didSelectRowAtIndex中的level1ViewController中的代码如下

// provide the 2nd level its content
level2ViewController.listContent = [[listContent objectAtIndex:indexPath.row] objectForKey:kChildrenKey];

我不需要关键部分,因为这是用于调用位置。这里的两个控制器示例代码都使用相同名称的NSArrays,它似乎是通过这一行将L1数组复制到L2数组。

他们使用推送的TableViews,这会让它变得简单,但我不是那样做,IBOutlets将信息加载到UITextView,所以我必须在RootView控制器中进行数组的分配,选择发生在那里。 如果我可以保留在RootView控制器中分配的ViolinMaker,那么我可以在详细信息中找到它,但我似乎无法弄明白......

感谢您帮助我,我真的被卡住了..

1 个答案:

答案 0 :(得分:1)

我认为问题的关键在于这一行:

ViolinMaker *violinMaker = (ViolinMaker *)violinMakers;

您要将NSMutableArray对象的地址指定给violinMaker。如果我理解正确,violinMakersViolinMaker个对象的数组。在这种情况下,你会想要:

ViolinMaker *violinMaker = [violinMakers objectAtIndex:index];

您必须在didSelectRowAtIndexPath:程序中获取索引。事实上,更好的方法可能如下:

  1. 将DetailsViewController更改为具有单个violinMaker属性(不是数组)
  2. 分配DetailsViewController后,设置violinMaker属性:

    detailsViewController.violinMaker = [violinMakers objectAtIndex:indexPath.row];

  3. 然后删除演员表(第一个代码示例),你应该在那里。

    不幸的是,Objective-C / XCode不适用于“IntelliSense编码”以及VS200x / .NET。通过几个教程然后回到这个项目可能是明智的。