如何将子视图的nsdictionary保存到基于tableviewcellselect的mainview

我目前正在parsing一些看起来像这样的XML

<Rows> <Row MANUFACTURERID="76" MANUFACTURERNAME="Fondont" ISMANU="F" ISAUTO="F"/> <Row MANUFACTURERID="18" MANUFACTURERNAME="Anti" ISMANU="T" ISAUTO="T"/> </Rows> 

我parsing它,以便有一个字典数组(每个字典有它的行的四个值)。

然后我将ManufacturerName传递给我的startSortingTheArray方法

 if (dataSetToParse == @"ICMfg") // ICMfg is a string passed to this view from the parent view cell selection enabling me to pass different data sets to this view { //Filter results (ISAUTO = T) NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"ISAUTO",@"T"]; NSArray *filteredArray = [myDataArray filteredArrayUsingPredicate:predicate]; //Passes Manufacturer strigs over to startSortingtheArray method [self startSortingTheArray:[filteredArray valueForKey:@"MANUFACTURER"]]; } 

所以从这里开始,所有的ManufacturerNames都以string数组的forms发送给我的方法。 然后我使用这个数组来设置我的所有部分/索引滚动。 下面的方法显示了我如何做到这一点。

 //method to sort array and split for use with uitableview Index - (IBAction)startSortingTheArray:(NSArray *)arrayData { //If you need to sort incoming array alphabetically use this line of code //TODO: Check values coming in for capital letters and spaces etc sortedArray = [arrayData sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; //If you want the standard array use this code //sortedArray = arrayData; self.letterDictionary = [NSMutableDictionary dictionary]; sectionLetterArray = [[NSMutableArray alloc] init]; //Index scrolling Iterate over values for future use for (NSString *value in sortedArray) { // Get the first letter and its associated array from the dictionary. // If the dictionary does not exist create one and associate it with the letter. NSString *firstLetter = [[value substringWithRange:NSMakeRange(0, 1)] uppercaseString]; //uppercaseString puts lowercase values with uppercase NSMutableArray *arrayForLetter = [letterDictionary objectForKey:firstLetter]; if (arrayForLetter == nil) { arrayForLetter = [NSMutableArray array]; [letterDictionary setObject:arrayForLetter forKey:firstLetter]; [sectionLetterArray addObject:firstLetter]; // This will be used to set index scroller and section titles } // Add the value to the array for this letter [arrayForLetter addObject:value]; } //Reload data in table [self.tableView reloadData]; } 

从这里我做了几个事情做后设置tableview [self.tableView reloadData]; 被调用,最主要的是我设置单元格的string值的数组。

 //Display cells with data NSArray *keys = [self.letterDictionary objectForKey:[self.sectionLetterArray objectAtIndex:indexPath.section]]; NSString *key = [keys objectAtIndex:indexPath.row]; cell.textLabel.text = key; 

当单元格被选中时,单元格内的string值将被发送回主视图,并在以后用作search参数…事情是,我设置了几个参数,将被用作一个searchstring。

回顾我parsing的XML

 <Rows> <Row MANUFACTURERID="76" MANUFACTURERNAME="Fondont" ISMANU="F" ISAUTO="F"/> <Row MANUFACTURERID="18" MANUFACTURERNAME="Anti" ISMANU="T" ISAUTO="T"/> </Rows> 

这些是在SQl表中有一个keyvalue MANUFACTURERID的列的值,它也在我parsing的其他表中find。 我想使用这些键值来限制/优化其他查询,但我不知道如何将它们传递给我的父视图,我设置了所有的search参数,这是我的问题如何保存值的字典与子视图中的用户表格select有关。 这样我就可以将这些值中的一个或某些值传递回不同数据集的子视图,以限制依赖于用户以前的select而显示的信息。

这花了我大约一个小时的时间来input。 希望这是有道理的,对于iOS开发和Objective C我还是比较新的,这个概念实际上是在推动我的能力,在我继续前进之前,最后还会有一些垃圾,之后我将不得不解决。或者你们中的一些人能够借给你这种types的经验给我,所以我可以第一次得到这个:)

如果您需要我澄清任何事情或为您提供更多信息,这些信息将帮助您让我知道。

提前致谢!

在视图控制器层次结构中向后传递信息的常见模式是使用委派。 您可以通过执行以下操作来实现这一点:

1)在SearchParametersViewController中定义一个协议,它代表你提到的父视图控制器。

 @protocol SearchParametersViewControllerDelegate <NSObject> @optional - (void)searchOptionsSelected:(NSArray *)selectedSearchOptions; @end 

2)在您的SearchOptionsSelectionViewController中符合该协议,该协议代表具有可供select的select列表的表视图控制器。 确保导入或转发协议在其中定义的类(例如SearchParametersViewController)。

 #import "SearchParametersViewController.h" @interface SearchOptionsSelectionViewController <SearchParametersViewControllerDelegate> 

3)在你的SearchOptionsSelectionViewController中定义一个委托属性(假设你在iOS 5.0上使用ARC,4.x使用unsafe_unretained而不是weak如果项目使用手动内存pipe理则使用assign 。 这个委托对象将包含对你的父视图控制器(例如SearchParametersViewController)的引用。 您不希望保留此属性以避免保留周期/循环引用,其中一个对象引用另一个对象,而引用又返回到第一个对象,并且这两个对象都不会被释放。

 @property (nonatomic, weak) id<SearchParametersViewControllerDelegate> delegate; 

4)在父视图控制器(SearchParametersViewController)中实例化SearchOptionsSelectionViewController实例时,将delegate属性设置为由self关键字表示的父视图控制器实例。 这可以确保您可以在视图控制器层次结构中向后发送消息(和相应的数据),但对象关系保持松散耦合。 这个委托协议可以符合任何其他视图控制器,在select视图控制器中没有紧密的关系返回到父视图控制器,链接它们的唯一的事情是select视图控制器采用灵活的委托协议。

 SearchOptionsSelectionViewController *selectionViewController = [[SearchOptionsSelectionViewController alloc] init]; selectionViewController.delegate = self; 

5)最后,在您的SearchOptionsSelectionViewController表视图的-tableView:didSelectRowAtIndexPath: delegate方法中,通过您在SearchParametersViewControllerDelegate协议中定义的委托方法将与选定行对应的数据传回给您的父视图控制器(SearchParametersViewController)。 您必须使用-respondsToSelector:方法确保委托对象实际实现了-searchOptionsSelected:委托方法。 要强制执行此操作,请在步骤#1中的协议定义的方法原型之上将@required更改为@requiredself.someDataArray表示您正在使用select表视图控制器的数据源。 发送回父视图控制器的委托协议方法和数据对象的细节可以改变,这里的重要事情是委托模式,并且在任何一个类的实例之间没有任何紧密耦合的关系,但是尤其是向后视图控制器层次结构。

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if ([self.delegate respondsToSelector:@selector(searchOptionsSelected:)]) { NSArray *selectedObjs = [NSArray arrayWithObject:[self.someDataArray objectAtIndex:indexPath.row]]; [self.delegate searchOptionsSelected:selectedObjs] } } 

6)SearchOptionsSelectionViewController.m实现委托方法

 - (void)searchOptionsSelected:(NSArray *)selectedSearchOptions { // do what you need to with selectedSearchOptions array } 

进一步阅读:

cocoa基本指南 – 代表和数据源

cocoa核心竞争力 – 协议

您可以使用应用程序委托来实现您的目标。

我将假设你的应用程序有一个像这样的结构。 请原谅这种模式的粗俗。

 Application delegate (A) --> Search Options View (B) --> Table where you do selections (C) | | --> Some other view where you need the selection (D) 

你的问题是你需要从Cstream向D的信息

您的应用程序委托具有可通过[[UIApplication sharedApplication] delegate]普遍访问的优点。 所以你可以从任何地方得到一个指针。 从C开始,您可以将select信息发送回A.一个可以自动发送给D,或者D可以随时从A请求它。

几点:

  • 目前我的答案我不会进一步扩大,因为现在这里是啤酒,另外我可能误解了你的要求。 如果你确实需要别的什么,我会在英国时间早上九点半起床,这样可能会有一些延迟。
  • 有些人以我build议的方式使用应用程序代理作为“数据转储”而皱眉。 其中一些人宁愿build立一个单独的class级,把它当作数据转储。 这似乎是这些无休止的争论之一,所以我尽量不参与。