Как сохранить 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, которые имеют ключевое значение MANUFACTURERID, которое также содержится в других таблицах, которые я анализирую. Я хотел бы использовать эти ключевые значения для ограничения/уточнения других запросов, но я просто не могу понять, как передать их в родительское представление, где я настроил все параметры поиска, то есть мой вопрос, как сохранить словарь значений, который связан с выбором tableview пользователей из подвью. Поэтому я могу передать одно или несколько из этих значений обратно в подзаголовок другого набора данных, чтобы ограничить информацию, отображаемую в зависимости от предыдущих вариантов пользователей.

Это заняло у меня около часа, чтобы напечатать. Надеюсь, это имеет смысл, я до сих пор довольно новичок в разработке 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 просто чувствую себя хорошо, чтобы иметь окончательный ответ, что я направляюсь в правильном направлении на один раз lol
добавлено автор 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, когда захочет.

Несколько баллов:

  • В настоящий момент я больше не буду расширять свой ответ, потому что сейчас здесь есть пиво, плюс я, возможно, неправильно понял ваше требование. Если вам что-то понадобится, я буду в детстве по утрам в Великобритании, так что может быть какая-то задержка.
  • Некоторые люди нахмурились, используя делегат приложения как «дамп данных», как я предложил. Некоторые из этих людей предпочли бы создать целый одноэлементный класс и рассматривать это как дамп данных. Кажется, это один из тех бесконечных аргументов, поэтому я стараюсь не вмешиваться.
3
добавлено
да, эта структура в значительной степени соответствует тому, с чем я работаю. Я изучил настройку своего собственного класса singleton .. и понимаю, как это сделать (вроде), но проблема majour у меня есть, как назвать ее, когда это необходимо в правильном порядке и т. Д. Спасибо за сообщение, я буду на какое-то время все же так увидимся, когда вы проснетесь: P человек, который болтается для моего пива oclock!
добавлено автор C.Johns, источник
lol yup Я получил это :) Я посмотрю на некоторые заметки на обоих до сих пор, прежде чем я передам код: 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://разработчик. apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html

1
добавлено
круто, собираюсь читать, хотя и тщательно сейчас .. :) Я рад, что ты понял, что я пытаюсь сделать .. его так сложно объяснить по-разному
добавлено автор C.Johns, источник
ahah, да, я перечитывал то, что я написал, и было похоже, что, может быть, я должен опубликовать этот материал внизу на вершине. Но остался с тем, что я сделал, и попытался написать описательный заголовок. :П
добавлено автор C.Johns, источник
хорошо, я прочитал ссылку на NSUserDefaults Class Reference, и я не думаю, что это очень подходящее решение для того, что я пытаюсь достичь atm .. однако Его я могу видеть, как я использую для некоторых других вещей, которые я пытаюсь сделать atm .. так что спасибо для этого .. собираюсь прочитать другую ссылку сейчас.
добавлено автор C.Johns, источник
Я должен был бы сказать то же самое о NSNotificationCenter Reference Reference также .. вызывающе то, что я хочу использовать, но для того, что я пытаюсь сделать здесь, не очень подходит .. или, по крайней мере, я не вижу, как я могу его использовать Вот.
добавлено автор C.Johns, источник
ха-ха, ты слишком старался. Я просто опустился на дно и зачитал, чтобы узнать, что вам нужно. лол
добавлено автор logancautrell, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.