如何根据tableviewcell选择将子视图的nsdictionary保存到主视图

C.J*_*hns 4 iphone uitableview nsxmlparser ios

我目前正在解析一些看起来像这样的xml

<Rows>
<Row MANUFACTURERID="76" MANUFACTURERNAME="Fondont" ISMANU="F" ISAUTO="F"/>
<Row MANUFACTURERID="18" MANUFACTURERNAME="Anti" ISMANU="T" ISAUTO="T"/>
</Rows>
Run Code Online (Sandbox Code Playgroud)

我解析它,以便有一个字典数组(每个字典都有行的四个值).

然后我将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"]];
    }
Run Code Online (Sandbox Code Playgroud)

因此,从这里将所有ManufacturerNames作为字符串数组发送到我的方法.然后我使用这个数组来设置我的所有section/index-scroller.下面的方法显示了我是如何做到这一点的.

//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];
}
Run Code Online (Sandbox Code Playgroud)

从这里开始我在[self.tableView reloadData]之后设置tableview做了几件事; 被称为,最主要的是我用数组的字符串值设置单元格.

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

    cell.textLabel.text = key;
Run Code Online (Sandbox Code Playgroud)

然后,当选择单元格时,单元格内的字符串值将被发送回主视图,并在以后用作搜索参数......事实是我正在设置几个将用作一个搜索字符串的参数.

回顾我解析的XML

<Rows>
    <Row MANUFACTURERID="76" MANUFACTURERNAME="Fondont" ISMANU="F" ISAUTO="F"/>
    <Row MANUFACTURERID="18" MANUFACTURERNAME="Anti" ISMANU="T" ISAUTO="T"/>
</Rows>
Run Code Online (Sandbox Code Playgroud)

这些是SQl表中具有键值MANUFACTURERID的列的值,该值也可以在我解析的其他表中找到.我想使用这些键值来限制/优化其他查询但我无法弄清楚如何将它们传递给我设置所有搜索参数的父视图,这是我的问题如何保存值的字典与子视图中的用户tableview选择有关.这样我就可以将其中一个或一些值传递回不同数据集的子视图,以限制显示的信息,具体取决于用户以前的选择.

打电话需要一个小时左右.希望它有意义,我仍然是iOS开发和Objective C的新手,这个概念真的在推动我的能力,在我继续前进并最终得到一些废话,我将不得不在以后修复我希望一个或者你们中的一些人能够将这种类型的经验借给我,所以我可以第一次得到这个:)

如果您需要我澄清任何内容或为您提供更多信息,以帮助您帮助我告诉我.

提前致谢!

And*_*rew 6

在视图控制器层次结构中向后传递信息的常见模式是使用委托.您可以通过实现以下方法在您的方案中实现此目的:

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

@protocol SearchParametersViewControllerDelegate <NSObject>
@optional
- (void)searchOptionsSelected:(NSArray *)selectedSearchOptions;
@end
Run Code Online (Sandbox Code Playgroud)

2)在SearchOptionsSelectionViewController中符合该协议,该协议表示具有可供选择的选择列表的表视图控制器.确保导入或转发声明定义协议的类(例如SearchParametersViewController).

#import "SearchParametersViewController.h"

@interface SearchOptionsSelectionViewController <SearchParametersViewControllerDelegate>
Run Code Online (Sandbox Code Playgroud)

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

@property (nonatomic, weak) id<SearchParametersViewControllerDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

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

SearchOptionsSelectionViewController *selectionViewController = [[SearchOptionsSelectionViewController alloc] init];
selectionViewController.delegate = self;
Run Code Online (Sandbox Code Playgroud)

5)最后,在SearchOptionsSelectionViewController表视图的-tableView:didSelectRowAtIndexPath:委托方法中,通过您在SearchParametersViewControllerDelegate协议中定义的委托方法将对应于所选行的数据传递回父视图控制器(SearchParametersViewController).您必须使用该-respondsToSelector:方法来确保委托对象实际实现-searchOptionsSelected:委托方法.要强制执行此实现,请在步骤1中的协议定义中更改@optional@required方法原型.self.someDataArray表示您与选择表视图控制器一起使用的数据源.可以更改发送回父视图控制器的委托协议方法和数据对象的细节,这里重要的是委托模式,并且在任一类的实例之间没有任何紧密耦合的关系,但特别是向后视图控制器层次结构.

- (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]
    }
}
Run Code Online (Sandbox Code Playgroud)

6)在里面实现委托方法SearchOptionsSelectionViewController.m

- (void)searchOptionsSelected:(NSArray *)selectedSearchOptions
{
    // do what you need to with selectedSearchOptions array
}
Run Code Online (Sandbox Code Playgroud)

进一步阅读:

可可基础指南 - 代表和数据来源

可可核心能力 - 协议