Як захаваць NSDictionary з падвіда ў MainView асновы ад выбару tableviewcell

Зараз я разбор некаторых XML, які выглядае наступным чынам





Я разабраць яго, так што ёсць мноства слоўнікаў (кожны слоўнік мае чатыры значэння радкі ў ім).

Я затым перадаць 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 накіроўваюцца мой метад, як масіў радкоў. Затым я выкарыстоўваю гэты масіў, каб наладзіць ўсе мае раздзелы/індэкс-скролерам. Метад ніжэй паказвае, як я гэта раблю.

//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]; называецца, галоўнае істота, што я паставіў клетку з радковымі значэннямі масіва.

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

    cell.textLabel.text = key;

калі клетка затым выбіраецца значэнне радкі ўнутры вочка затым адпраўляецца назад на галоўны экран і выкарыстоўваць пазней у якасці параметру пошуку ... Справа ў тым, што істота я ўсталёўваю некаторыя параметры, якія будуць выкарыстоўвацца ў якасці адной пошукавага радка.

Азіраючыся на xml я разабраны


    
    

Гэтыя значэння слупкоў ўнутры табліцы SQl, якая мае KeyValue MANUFACTURERID, які таксама ўтрымліваецца ў іншых табліцах, якія я аналізую. Я хацеў бы выкарыстаць гэтыя ключавыя значэння для абмежавання/ўдакладніць іншыя пытанні, але я проста не магу зразумець, як перадаць іх на мой parentview, дзе я стварыў усе параметры пошуку, то ёсць маё пытанне, як я магу захаваць слоўнік значэнняў, ставяцца да выбару карыстальнікаў Tableview ад падвіда. Так што я магу затым перадаць адзін ці некаторыя з гэтых значэнняў назад у падвід іншага набору дадзеных, каб абмежаваць інфармацыю, якая адлюстроўваецца ў залежнасці ад карыстальнікаў папярэдніх выбараў.

Гэта ўзяў мяне каля гадзіны, каб надрукаваць. Спадзяюся, што гэта мае сэнс, я ўсё яшчэ досыць новае для развіцця iOS і Objective C, і гэтая канцэпцыя сапраўды штурхаючы свае магчымасці і, перш чым я рухацца далей і ў канчатковым выніку hasing некаторы дзярмо разам, што я павінен буду выправіць пазней я спадзяюся, што адзін ці некаторыя з вас змогуць пазычыць свой вопыт у гэтым тыпе гэта для мяне, так што я магу атрымаць гэта права ў першы раз :)

Калі вам трэба, каб я ўдакладніць што-небудзь ці даць Вам дадатковую інфармацыю, якая дапаможа вам дапамагчы мне проста дайце мне ведаць.

Загадзя дзякую!

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
}

<Моцны> Далейшае чытанне:

Какава Кіраўніцтва Асновы - Дэлегаты і крыніцы дадзеных

Какава Асноўныя Кампетэнцыі - Пратакол

6
дададзена
Выдатна, выратаваў мой дзень! Проста невялікая нататка: SearchOptionsSelectionViewController.m на кроку 6 павінна быць SearchParametersViewController.m (бацькоў)
дададзена аўтар Tumtum, крыніца
ідэальна падыходзіць .. Я на самой справе ужо пачаў спускацца па гэтай дарозе і патрапіў у кропку, дзе я змог перадаць значэнне масіва для бацькоўскага выгляду. Але дзякуй за гэта тлумачэнне, як гэта тлумачыць мне, што я зрабіў: P 100 ачкоў за вамі, сэр! :)
дададзена аўтар 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)

Ваша праблема заключаецца ў тым, што вам патрэбна інфармацыя цячы ад З да D.

Дадатак дэлегат мае перавагу, што з'яўляецца універсальна даступным праз [[UIApplication sharedApplication] дэлегат] . Такім чынам, вы можаце атрымаць паказальнік на яго з любой кропкі свету. Ад C, вы можаце адправіць інфармацыю аб выбары назад А. можа альбо адправіць гэта аўтаматычна ў D або D можа запытаць яго ад А кожны раз, калі ён хоча.

Пара момантаў:

  • Не будзе пашырацца далей у маім адказе на дадзены момант, таму што гэта піва аб »гадзіны тут цяпер, плюс я мог бы няправільна ваша патрабаванне. Калі вы робіце што-небудзь яшчэ трэба, я буду уверх на дзіця O »гадзін раніцы па лонданскаму часу, так што можа быць некаторая затрымка.
  • Некаторыя людзі хмурацца на выкарыстанні дэлегаты прыкладання, як «дамп дадзеных» у шляху я прапанаваў. Некаторыя з гэтых людзей аддалі перавагу б стварыць цэлы клас одноплодной і лячэнне, што ў якасці звалкі дадзеных замест гэтага. Гэта, здаецца, адзін з тых бясконцасці аргументаў, таму я стараюся не захапляцца.
3
дададзена
так, гэтая структура ў значнай ступені менавіта тое, што я працую з. Я глядзеў у стварэнні свайго ўласнага класа одноплодной .. і зразумець, як гэта зрабіць (выгляд), але пытанне majour я быть_наст, як назваць яго, калі гэта неабходна ў правільным парадку, і г.д. Дзякуй за пост я буду на на некаторы час, але так можа бачыць вас, калі вы прачнецеся: P чалавек ім боўтацца для маіх піва гадзін!
дададзена аўтар C.Johns, крыніца
лол да я атрымаў, што :) я буду глядзець на некаторыя ноты на абодвух на дадзены момант, перш чым я здзейсніць код: P
дададзена аўтар C.Johns, крыніца
? Я мог бы стварыць дэлегат перадаць значэння назад у карыстацкім NSObject права ... Мне трэба зрабіць больш чытання ..: P
дададзена аўтар C.Johns, крыніца
Піва спускаючыся ласункам ... Проста каб сказаць, што я не абараняю адзіночку, я б выкарыстоўваць прыкладанне дэлегат. Я проста апярэджваючы крытыку.
дададзена аўтар jrturton, крыніца

У вас ёсць некалькі варыянтаў, адзін павінен выкарыстоўваць па змаўчанні карыстальніка. Гэта можа быць простай.

Http://распрацоўшчык. apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html

Іншы спосаб складаецца апублікаваць апавяшчэнне з інфармацыяй.

Http://распрацоўшчык. apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html

1
дададзена
крута, буду чытаць, хоць і грунтоўна зараз .. :) Im рады, што вы маглі зразумець, што ім спрабуюць зрабіць .. яго так цяжка растлумачыць corectly
дададзена аўтар C.Johns, крыніца
ахі, ды я перачытваў тое, што я напісаў, і быў, як, магчыма, я павінен размясціць гэты матэрыял у ніжняй частцы на вяршыні .. але застаўся з тым, што я зрабіў і паспрабаваў зрабіць змястоўны загаловак. : P
дададзена аўтар C.Johns, крыніца
добра я прачытаў NSUserDefaults Class Reference і не думае, што вельмі зручны рашэнне для таго, што я спрабую дасягнуць атм .. аднак яго што-то я магу бачыць сябе, выкарыстоўваючы для некаторых іншых рэчаў, я спрабую зрабіць атм .. так што дзякуй для гэтага .. прачытаю іншую спасылку прама цяпер.
дададзена аўтар C.Johns, крыніца
Я хацеў бы сказаць тое ж самае пра NSNotificationCenter Class Reference таксама .. задзірліва-то я хачу выкарыстоўваць, але для таго, што я спрабую зрабіць тут не так падыходзіць .. ці, па меншай меры, я не магу бачыць, як я мог бы выкарыстаць яго тут.
дададзена аўтар C.Johns, крыніца
ха-ха, вы перастараліся. Я толькі абястлушчанае на дно і чытаць, каб даведацца, што вам трэба. лол
дададзена аўтар logancautrell, крыніца