サブビューのnsdictionaryをmainviewに保存する方法

私は現在、このように見えるいくつかのXMLを解析しています





私は辞書の配列があるようにそれを解析します(各辞書にはRowの4つの値があります)。

私は次にこのように私のstartSortingTheArrayメソッドにManufacturerNameを渡します

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が文字列の配列として私のメソッドに送られます。私はこの配列を使って、すべてのセクション/インデックススクロールを設定します。以下の方法は私がこれをやっている様子を示しています。

//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];
}

ここから私は [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;

セルが選択されると、セル内の文字列の値がメインビューに返され、後で検索パラメータとして使用されます。つまり、1つの検索文字列として使用されるいくつかのパラメータを設定しています。

解析したXMLを振り返る


    
    

これらは、SQlテーブル内のカラムの値で、キー値MANUFACTURERIDを持ちます。この値は、解析する他のテーブルにもあります。私はこれらのキー値を使用して他のクエリを制限/調整したいと思いますが、すべての検索パラメータを設定する親ビューにそれらを渡す方法はわかりません。それは私の質問です。サブビューからのユーザーテーブルビューの選択に関連しています。だから私は、それらの値の1つまたはいくつかを、別のデータセットのサブビューに戻して、ユーザの以前の選択に応じて表示される情報を制限することができます。

これはタイプアップするのに約1時間かかりました。うまくいけば、私はまだiOS開発とObjective Cについてかなり新しいです、そして、このコンセプトは本当に私の能力を押し進めていきます。そして、私が後で解決しなければならないことをやっていく前に、またはあなたの何人かは私にこのタイプのこれのあなたの経験を貸すことができるように私はこの最初の時間を得ることができる:)

あなたが何かを明確にしたり、私に助けになるより多くの情報を教えてくれれば私に知らせてください。

前もって感謝します!

4
それのための笑い声:)
追加された 著者 C.Johns,
あなたはあなたがこの質問に入れた努力の量を知ることができます。あなたが何をしようとしているのか、あなたの動機は何か、どこに問題があるのか​​は非常に明確です。爽やかな変化に!
追加された 著者 jrturton,

3 答え

ビューコントローラ階層で情報を後方に渡すための共通のパターンは、委譲を使用することです。これを実現するには、以下を実装します。

1) Define a protocol in the SearchParametersViewController, which represents your the parent view controller you mentioned.

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

2) Conform to that protocol in your SearchOptionsSelectionViewController, which represents the table view controller that has a list of selections to choose from. Make sure to import or forward-declare the class the protocol is defined in (e.g. SearchParametersViewController) .

#import "SearchParametersViewController.h"

@interface SearchOptionsSelectionViewController 

3) Define a delegate property in your SearchOptionsSelectionViewController (assumes you are using ARC on iOS 5.0, 4.x use unsafe_unretained instead of weak. Use assign if the project is using manual memory management). This delegate object will contain a reference to your parent view controller (e.g. SearchParametersViewController). You do not want this property to be retained as to avoid retain cycles/circular references where one object references another, which in turn has a reference back to the first and neither object is ever deallocated.

@property (nonatomic, weak) id delegate;

4) When instantiating the SearchOptionsSelectionViewController instance inside your parent view controller (SearchParametersViewController), set the delegate property to the parent view controller instance as represented by the self keyword. This ensures you can send the message (and corresponding data) backward in your view controller hierarchy, yet the object relationships remain loosely coupled. This delegate protocol could be conformed to in any other view controller, there are no tight relationships in the selection view controller back to the parent view controller, the only thing linking them is the flexible delegate protocol adoption by the selection view controller.

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

5) Finally, in your SearchOptionsSelectionViewController table view's -tableView:didSelectRowAtIndexPath: delegate method, pass the data corresponding to the selected row back to your parent view controller (SearchParametersViewController) via the delegate method you defined in the SearchParametersViewControllerDelegate protocol. You must use the -respondsToSelector: method to ensure that the delegate object actually implements the -searchOptionsSelected: delegate method. To force this implementation, change @optional to @required above the method prototype in the protocol definition in step #1. self.someDataArray represents a the data source you are using with the selection table view controller. The specifics of the delegate protocol method and data object(s) sent back to the parent view controller can be changed, the important thing here is the delegation pattern and not having any tightly coupled relationships between the instances of either class, but especially backwards in the view controller hierarchy.

- (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) Implement the delegate method inside SearchOptionsSelectionViewController.m

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

追加情報:

Cocoa Fundamentals Guide - デリゲートとデータソース

Cocoa Coreコンピテンシー - プロトコル

6
追加された
優秀、私の一日を救った!ちょっとした注意:ステップ6の SearchOptionsSelectionViewController.m は、 SearchParametersViewController.m (親)でなければなりません。
追加された 著者 Tumtum,
完璧です。私は実際にはすでにこの道を歩み始めており、配列の値を親ビューに渡すことができます。しかし、この説明に感謝します。それは私が何をしたのかを私に説明します。 :)
追加された 著者 C.Johns,
私は19時間で私の賞金を授与するかもしれません!あなたは明日にそれを持っていきます:Pもう一度ありがとう。
追加された 著者 C.Johns,
どういたしまして! :Pはちょうど私が正しい方向に一度笑いを浮かべているという決定的な答えを得るのに良い気分です
追加された 著者 C.Johns,
私は助けることができてうれしいです、恩恵のためにありがとう!
追加された 著者 Andrew,

ここで目的を達成するには、アプリケーションデリゲートを使用することができます。

私は、あなたのアプリがこのような少しの構造を持っていると仮定します。このモデルのクールなことを許してください。

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

あなたの問題は、CからDへ流れる情報が必要なことです。

あなたのアプリケーションデリゲートは、 [[UIApplication sharedApplication] delegate] を介して普遍的にアクセスできるというメリットがあります。だからどこからでもポインタを得ることができます。 Cから、選択情報をAに送り返すことができます。Aはこれを自動的にDに送信することも、DはAからAに要求することもできます。

いくつかのポイント:

  • ビールは今ここに時計を入れていますので、私の答えはこれ以上展開しません。あなたの要件を誤解しているかもしれません。あなたが他に何か必要があれば、私は朝の英国時間に赤ちゃんの時計になるでしょうので、少し遅れがあるかもしれません。
  • 一部の人々は、私が提案した方法でアプリケーションデリゲートを「データダンプ」として使用することに戸惑う。これらの人々の中には、むしろシングルトンクラス全体を設定し、その代わりにデータダンプとして扱う人もいます。私が関与しないようにするために、それはまったく根本的な議論の1つと思われる。
3
追加された
うん、その構造は、まさに私が働いているものです。私は自分のシングルトンクラスを設定することに目を向けています。そして、それを行う方法を理解していますが、私が持っているmajourの問題は、正しい順序で必要なときにそれを呼び出す方法です。あなたが目を覚ましたときにあなたを見るかもしれません:P男私のビールoclockのためにぶらぶらしている!
追加された 著者 C.Johns,
私はそれを持っている:)私はコードにコミットする前に、両方のいくつかのノートを見てみましょう:P
追加された 著者 C.Johns,
値をカスタムNSObjectの権利に戻すためのデリゲートを設定することができますか?もっと読む必要があります:P
追加された 著者 C.Johns,
ビールが治療を受けて...私はシングルトンを主張していないと言って、私はアプリ代議員を使用したいと思います。私は批判を先制していた。
追加された 著者 jrturton,

いくつかの選択肢があります.1つはユーザーのデフォルトを使用することです。それは最も簡単かもしれません。

http:// developer。 apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html

別の方法は、情報を通知することです。

http:// developer。 apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html

1
追加された
クール、両方とも徹底的に読むつもりです:)私は何をしようとしているのか理解できてうれしいです。
追加された 著者 C.Johns,
ああ、うん、私は私が書いたことを再読していたかもしれません、おそらく、私はこの物を上の一番下に掲示しなければなりませんでしたが、私がやったことにとどまり、説明的なタイトルをつけようとしました。 :P
追加された 著者 C.Johns,
大丈夫私はNSUserDefaultsクラスリファレンスを読んでいると私はatmを達成しようとしているもののための非常に適切な解決策とは思わない..しかし、私は自分自身を私がatmをしようとしているいくつかの他のもののために使用して見ることができる何か..ありがとうそのために、もう一方のリンクを読むつもりです。
追加された 著者 C.Johns,
私はNSNotificationCenter Class Referenceについても同じことを言わなければならないでしょう。挑戦的に何かをしたいと思っていますが、私がここでやってみようとしていることは適切ではありません。ここに。
追加された 著者 C.Johns,
ハハ、あなたはあまりにも頑張った。私はちょうど底にスキミングし、あなたが必要なものを見つけるために読んだ。笑
追加された 著者 logancautrell,