Uitableview 在两个控制器之间共享阵列中的didSelectRowAtIndexPath选择

Uitableview 在两个控制器之间共享阵列中的didSelectRowAtIndexPath选择,uitableview,nsmutablearray,uitextview,didselectrowatindexpath,Uitableview,Nsmutablearray,Uitextview,Didselectrowatindexpath,在我无休止地寻求将一个表行选择共享到一个模式视图中加载的多个视图时,我将其归结为一个问题。我正在使用Apple DrillDownSave示例代码作为模型来重新创建这个魔术。我想我把一切都安排得一模一样 在RootViewController.m的didselectrowatinexpath部分中,我有以下代码将violinMakers MSMutableArray复制到同名的DetailsView MSMutableArray。所有的颜色编码,没有错误告诉我我走在正确的道路上。。但是 deta

在我无休止地寻求将一个表行选择共享到一个模式视图中加载的多个视图时,我将其归结为一个问题。我正在使用Apple DrillDownSave示例代码作为模型来重新创建这个魔术。我想我把一切都安排得一模一样

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

detailsView.violinMakers = [violinMakers objectAtIndex:indexPath.row];
在RootviewController.h文件中,我通过以下方式引用DetailsViewController:

@class DetailViewController

DetailsViewController *detailsView;
NSMutableArray *violinMakers; 
@property (nonatomic, retain) NSMutableArray *violinMakers;
然后在详细的viewcontroller.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,并通过以下方式将其作为模式视图启动:

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];
我在构建时没有收到任何错误,视图也会加载,但textView中的信息是空白的。这也告诉我它没有加载任何内容,并且连接正确。。。我是如此接近。。。但我可以从我的NSLog中看出,该值为:

violinMakerDescription in detailsView: (null)
因此,RootviewController中的violinMakers不会被复制到DetailsViewController中的violinMakers数组中。我不想承认这一点,但几个星期以来,我一直在尝试各种解决方案,通过appDelegate、NSDictionary和各种其他方法来实现这一点,但都无济于事。我认为答案是violinMakers被发布了,然后什么也不传递,或者RootViewController中的赋值行不起作用。有人知道我能改变什么吗

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

谢谢大家

柯克

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

[detailsView.violinMakers addObject: [violinMakers objectAtIndex:indexPath.row]];
@坦率的 首先感谢你在这方面的帮助!! 我确实以同样的方式在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将它加载到数组中,然后复制该数组并从DetaiViewController将其放入ViolinMaker对象中是可行的。我不想在DetailsViewController中重新创建ViolinMaker对象,只需从数组中重新加载它,就像从RootViewController中重新加载一样

这就是DrillDownSave Apple示例如何实现的,我已经镜像了此配置。其中,在DidSelectRowatinex中的level1ViewController中,输入以下代码

// provide the 2nd level its content
level2ViewController.listContent = [[listContent objectAtIndex:indexPath.row] objectForKey:kChildrenKey];
我不需要关键部分,因为那是用来回忆位置的。示例代码中的两个控制器都使用相同名称的nsarray,它似乎正在通过此行将L1数组复制到L2数组

它们使用推送的TableView,这将使它变得简单,但我并不是这样做,而是将信息加载到UITextView,因此我必须在发生选择的RootView控制器中分配数组。 如果我可以保留在RootView控制器中分配的ViolinMaker,那么我就可以在细节中选择它,但我似乎也无法理解


谢谢你的帮助,我真的被困住了。

我认为问题的关键在于这句话:

ViolinMaker *violinMaker = (ViolinMaker *)violinMakers;
您正在将
NSMutableArray
对象的地址分配给
violinMaker
。如果我理解正确,
ViolinMaker
是一个
ViolinMaker
对象数组。在这种情况下,您需要:

ViolinMaker *violinMaker = [violinMakers objectAtIndex:index];
您必须在
didSelectRowAtIndexPath:
过程中获取索引。事实上,更好的方法可能是:

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

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

  • 然后删除cast(第一个代码示例),您应该基本上就在那里了


    不幸的是,Objective-C/XCode不像VS200x/.NET那样适合“通过IntelliSense进行编码”。通过一些教程,然后再回到这个项目,这可能是明智的

    你能把你的花括号之类的东西加进去吗?我感到困惑:)另外,我假设details视图一次显示一个ViolinMaker的详细信息是否正确?正确,Frank,ViolinMakers是加载ViolinMaker对象的数组。在ViolinMaker中,我定义了从中提取信息的字段(ViolinMaker描述),并更正了detailsView只是一个makers信息。我遇到的问题是,details控制器不是一个表,所以我不能使用indexpath调用,所以我在RootViewController中这样做,然后尝试将该选择发送到数组,然后将其放置在DetailsView中的对象中。我也无法在MakerView中设置indexPath.row,它是DetailsController,也不是TableView。只是要明确的是,数据流是:RootViewController-MakerView RootViewController-DetailsView,但