在我永无止境的任务中,将表行选择共享到模态视图中加载的多个视图,我将其归结为一个问题。我使用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,那么我可以在详细信息中找到它,但我似乎无法弄明白......
感谢您帮助我,我真的被卡住了..
答案 0 :(得分:1)
我认为问题的关键在于这一行:
ViolinMaker *violinMaker = (ViolinMaker *)violinMakers;
您要将NSMutableArray
对象的地址指定给violinMaker
。如果我理解正确,violinMakers
是ViolinMaker
个对象的数组。在这种情况下,你会想要:
ViolinMaker *violinMaker = [violinMakers objectAtIndex:index];
您必须在didSelectRowAtIndexPath:
程序中获取索引。事实上,更好的方法可能如下:
分配DetailsViewController后,设置violinMaker
属性:
detailsViewController.violinMaker = [violinMakers objectAtIndex:indexPath.row];
然后删除演员表(第一个代码示例),你应该在那里。
不幸的是,Objective-C / XCode不适用于“IntelliSense编码”以及VS200x / .NET。通过几个教程然后回到这个项目可能是明智的。