Hoe nsdictionary van een subview op te slaan naar een mainview op basis van tableviewcell selectie

Ik parseer momenteel wat xml dat er zo uitziet





Ik parse het zodat er een array van woordenboeken is (elk woordenboek heeft de vier waarden van de rij erin).

Ik geef vervolgens ManufacturerName door aan mijn startSortingTheArray-methode, zoals deze

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

Dus vanaf hier worden alle fabrikantnamen naar mijn methode verzonden als een reeks tekenreeksen. Ik gebruik vervolgens deze array om al mijn secties/index-scroller in te stellen. De onderstaande methode laat zien hoe ik dit doe.

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

vanaf hier doe ik verschillende dingen die ik kan doen met het instellen van de tabweergave nadat [self.tableView reloadData]; is aangeroepen, met als belangrijkste ding dat ik de cel met de tekenreekswaarden van de array instel.

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

    cell.textLabel.text = key;

wanneer de cel wordt geselecteerd, wordt de tekenreekswaarde in de cel vervolgens teruggestuurd naar de hoofdweergave en later gebruikt als een zoekparameter ... Het probleem is dat ik verschillende parameters instel die als één zoekreeks worden gebruikt.

Terugkijkend op de xml die ik heb geparseerd


    
    

Dit zijn de waarden van kolommen binnen een SQl-tabel met een sleutelvalue FABRIKANTID die ook voorkomt in andere tabellen die ik analyseer. Ik wil deze sleutelwaarden gebruiken om andere query's te beperken/verfijnen, maar ik kan gewoon niet achterhalen hoe ik ze moet doorgeven aan mijn parentview, waar ik alle zoekparameters instel, dat is mijn vraag, hoe kan ik het woordenboek met waarden opslaan dat is gerelateerd aan de tableview-selectie van gebruikers uit de subweergave. Zodat ik vervolgens een of meer van die waarden kan doorgeven aan de subweergave van een andere gegevensset om de informatie te beperken die wordt weergegeven afhankelijk van de eerdere selecties van de gebruiker.

Dit heeft me ongeveer een uur gekost om te typen. Hopelijk is het logisch, ik ben nog steeds vrij nieuw voor iOS-ontwikkeling en doelstelling C, en dit concept duwt echt mijn mogelijkheden en voordat ik verder ga en uiteindelijk een beetje rotzooi heb dat ik later moet oplossen, hoop ik dat of sommigen van jullie zullen in staat zijn om dit soort ervaringen aan mij uit te lenen, zodat ik dit de eerste keer goed kan doen :)

Als je me nodig hebt om iets te verduidelijken of om je meer informatie te geven die je kan helpen, laat het me dan gewoon weten.

Bij voorbaat dank!

4
haha proost daarvoor :)
toegevoegd de auteur C.Johns, de bron
Je kunt zien hoeveel moeite je hebt gestoken in deze vraag. Het is heel duidelijk wat u probeert te doen, wat uw motivaties zijn en waar uw probleem is. Maakt een verfrissende verandering!
toegevoegd de auteur jrturton, de bron

3 antwoord

Het algemene patroon voor het achterstevoren doorgeven van informatie in de hiërarchie van uw weergavecontroller is om delegatie te gebruiken. U kunt dit in uw scenario bereiken door het volgende te implementeren:

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
}

Meer informatie:

Gids voor cacao-grondbeginselen - afgevaardigden en gegevensbronnen

Cocoa Core Competenties - Protocol

6
toegevoegd
Uitstekend, mijn dag gered! Een kleine opmerking: SearchOptionsSelectionViewController.m in stap 6 moet SearchParametersViewController.m zijn (het bovenliggende element)
toegevoegd de auteur Tumtum, de bron
perfect .. Ik ben deze weg eigenlijk al begonnen en ben zover gekomen dat ik de arraywaarde kan doorgeven aan de bovenliggende weergave. Maar bedankt voor deze uitleg, omdat het me uitlegt wat ik heb gedaan: P 100 punten voor u meneer! :)
toegevoegd de auteur C.Johns, de bron
Ik kan mijn premie in 19 uur uitgeven! lol .. je hebt ze morgen: P nogmaals bedankt.
toegevoegd de auteur C.Johns, de bron
graag gedaan! : P voel me gewoon goed om een ​​definitief antwoord te hebben dat ik de goede kant op ga voor een keer lol
toegevoegd de auteur C.Johns, de bron
Ik ben blij dat ik kon helpen, bedankt voor de premie!
toegevoegd de auteur Andrew, de bron

U kunt de gedelegeerde toepassing gebruiken om uw doelen hier te bereiken.

Ik ga ervan uit dat je app een structuur heeft die er ongeveer zo uitziet. Excuses voor de grofheid van dit model.

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

Uw probleem is dat u informatie nodig hebt om van C naar D te stromen.

Uw toepassingsdeelnemer heeft de verdienste universeel toegankelijk te zijn via [[UIApplication sharedApplication] delegate] . U kunt dus overal vandaan komen met een aanwijzer. Vanaf C kunt u uw selectie-informatie terugsturen naar A. A kan dit automatisch naar D sturen, of D kan het vanaf A opvragen wanneer het dat wil.

Een paar punten:

  • Ik zal mijn antwoord op dit moment niet verder uitbreiden omdat het hier nu bier is, en ik heb uw vereiste misschien verkeerd begrepen. Als je nog iets anders nodig hebt, ben ik 's ochtends in het VK tijd om' s ochtends vroeg op te bellen, dus er kan wat vertraging zijn.
  • Sommige mensen fronsen in het gebruik van de applicatiedelegate als een "data dump" op de manier die ik heb voorgesteld. Sommige van die mensen zetten liever een hele singleton-klasse op en behandelen dat in plaats daarvan als een gegevensverzameling. Het lijkt een van die nooit aflatende argumenten te zijn, dus ik probeer niet betrokken te raken.
3
toegevoegd
ja, die structuur is eigenlijk precies waar ik mee werk. Ik heb gekeken naar het opzetten van mijn eigen singleton-klasse .. en begrijp hoe ik het moet doen (soort van) maar het grootste probleem dat ik heb is hoe het te bellen wanneer nodig in de juiste volgorde etc. Bedankt voor het bericht dat ik zal plaatsen voor een tijdje nog zo zou kunnen zien als je wakker wordt: P man im rondhangen voor mijn bier oclock!
toegevoegd de auteur C.Johns, de bron
lol yup ik heb dat :) Ik zal een paar opmerkingen over beide bekijken voor nu voordat ik me aan de code committeer: P
toegevoegd de auteur C.Johns, de bron
Ik zou een afgevaardigde kunnen instellen om de waarden door te geven aan een aangepast NSObject-recht? ... Ik moet meer lezen ..: P
toegevoegd de auteur C.Johns, de bron
Bier valt in de war ... gewoon om te zeggen dat ik geen singleton voorstond, ik zou de app-afgevaardigde gebruiken. Ik was alleen maar vooruitlopend op kritiek.
toegevoegd de auteur jrturton, de bron

Je hebt een paar opties, een is om de standaardinstellingen van de gebruiker te gebruiken. Het is misschien de makkelijkste.

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

Een andere is om een ​​kennisgeving met de informatie te plaatsen.

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

1
toegevoegd
cool, ik ga nu echter allebei grondig lezen .. :) ik ben blij dat je kon begrijpen wat ik probeerde te doen .. het is zo moeilijk om corectly uit te leggen
toegevoegd de auteur C.Johns, de bron
ahah, ja ik was opnieuw aan het lezen wat ik had geschreven en had de indruk dat ik dit spul onderaan onderaan moest plaatsen ... maar bleef bij wat ik had gedaan en probeerde een beschrijvende titel te maken. : P
toegevoegd de auteur C.Johns, de bron
oke ik heb NSUserDefaults Class Reference gelezen en ik vind niet dat dit een zeer geschikte oplossing is voor wat ik probeer te bereiken. Maar het is iets dat ik zelf kan gebruiken voor andere dingen die ik probeer te doen, atm .. dus bedankt daarvoor ... ga ik de andere link nu lezen.
toegevoegd de auteur C.Johns, de bron
Ik zou hetzelfde moeten zeggen over NSNotificationCenter Class Reference ook .. zeker iets waar ik gebruik van wil maken, maar voor wat ik hier probeer te doen, niet zo geschikt .. of ik kan tenminste niet zien hoe ik er gebruik van kan maken hier.
toegevoegd de auteur C.Johns, de bron
haha, je probeerde te hard. Ik snelde gewoon naar de bodem en las het op om te ontdekken wat je nodig had. lol
toegevoegd de auteur logancautrell, de bron