Як зберегти nsdictionary від підвійного перегляду до основного перегляду, заснованого на вибір таблиці viewcell

В даний час я аналізую XML-файл, який виглядає так





Я проаналізую його так, що існує безліч словників (у кожного словника є чотири значення рядка в ньому).

Тоді я передаю ім'я ProducerName для мого методу 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"]];
    }

Отже, звідси всі Ім'я Виробника надсилаються до мого методу як масив рядків. Тоді я використовую цей масив, щоб налаштувати всі мої розділи/індекс-скроллер. Нижче показано, як я роблю це.

//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]; називається. Головне, що я встановлюю клітинку зі строковими значеннями масиву.

//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, яка має ключове значення MANUFACTURERID, яке також знаходиться в інших таблицях, які я аналізую. Я хотів би використовувати ці ключові значення для обмеження/уточнити інші питання, але я просто не можу зрозуміти, як передати їх на мій parentview, де я створив всі параметри пошуку, тобто моє запитання, як я можу зберегти словник значень, пов'язаний із вибором таблиць для перегляду користувачів з підввія. Так що я можу потім передати один чи декілька з них значень назад в підвид іншого набору даних, щоб обмежити інформацію, яка відображається в залежності від користувачів попередніх виборів.

Це забрало мене близько години, щоб набрати його. Сподіваюся, що це має сенс, я все ще досить новий для розробки 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
}

Додаткові відомості:

Керівництво з какао-фундамента - делегати та джерела даних

Компетенції какао-основного складу - протокол

6
додано
Відмінно, врятував мій день! Просто невелика примітка: SearchOptionsSelectionViewController.m на кроці 6 має бути SearchParametersViewController.m (батьківський)
додано Автор Tumtum, джерело
досконалий .. Я фактично вже почав цю дорогу і досягла точки, де я можу передавати значення масиву до батьківського виду. Але спасибі за це пояснення, оскільки це пояснює мені те, що я зробив: P 100 очок для вас, сер! :)
додано Автор C.Johns, джерело
Я можу нагородити свою щедрість за 19 годин! LOL .. Ви будете мати їх завтра: 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. Ви можете автоматично надіслати його на D, або D може надіслати запит від A кожного разу, коли це буде потрібним.

Пара пунктів:

  • Я більше не буду розширювати мою відповідь на даний момент, тому що це зараз пивний годинник, і я, можливо, неправильно зрозумів вашу вимогу. Якщо вам потрібно щось інше, я буду в дитячому віці вранці у вівторок, тому може відбутися деяка затримка.
  • Деякі люди натякають на використання делегату програми як "дамп даних", як я запропонував. Деякі з цих людей, скоріше за все, створили цілий клас одиночного класу і розглядають це як звалище даних. Здається, це один з тих безперспективних аргументів, тому я намагаюся не втручатися.
3
додано
Так, ця структура в значній мірі точно, що я працюю. Я подивився, як налаштувати свій клас одиночного класу .. і зрозуміти, як це зробити (різновид), але проблема у мене є, як назвати це, коли це потрібно в правильному порядку тощо. Дякую за повідомлення, я буду на деякий час ще так може побачити вас, коли ви прокинетесь: P людина, що я вигулюю для мого пивного годинника!
додано Автор C.Johns, джерело
LOL я, що я отримав це :) Я подивися на деякі нотатки на обох зараз, перш ніж я зобов'язуюсь код: P
додано Автор C.Johns, джерело
Я міг би створити делегата, щоб передавати значення назад до належного NSObject права? ... Мені потрібно більше читання ..: P
додано Автор C.Johns, джерело
Пиво знижує старість ... Просто, щоб сказати, що я не виступав за синглтон, я б використав делегат програми. Я просто випередив критику.
додано Автор jrturton, джерело

У вас є кілька варіантів, один - користуватись за замовчуванням користувачами. Це може бути найпростіше.

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
додано
круто, збираюся читати, хоча обидва цілком зараз .. :) Я радий, ти можеш зрозуміти, що я намагаюся зробити .. його так важко пояснити corectly
додано Автор C.Johns, джерело
ага, так, я перечитав те, що я написав, і, можливо, я повинен був розмістити цю інформацію внизу на вершині .., але залишився з тим, що я зробив, і намагався зробити описову назву. : П.
додано Автор C.Johns, джерело
добре, я прочитав NSUserDefaults Class Reference, і я не вважаю дуже підходящим рішенням для того, що я намагаюся досягти atm .. проте його щось я бачу себе, використовуючи для деяких інших речей, я намагаюся зробити atm .. так спасибі для цього .. збираюся прочитати іншу посилання зараз.
додано Автор C.Johns, джерело
Я повинен сказати те ж саме про NSNotificationCenter Reference Class також .. виразно те, що я хочу використовувати, але для того, що я намагаюся зробити тут, не дуже підходить .. або, принаймні, я не бачу, як я міг би скористатися ним тут
додано Автор C.Johns, джерело
ха-ха, ти пробував дуже сильно. Я просто знімався донизу і читав, щоб дізнатись, що вам потрібно. Лол
додано Автор logancautrell, джерело
IT KPI iOS
IT KPI iOS
74 учасників

Чат обсуждения IOS. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/602

ios_jobs_ua
ios_jobs_ua
27 учасників

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.