tableView: didSelectRowAtIndexPath: вызов делегатов текущего представления Parser - PullRequest
1 голос
/ 26 января 2012

У меня есть довольно интересная логика, в основном у меня есть эти данные, которые я хочу проверить перед тем, как отобразить следующее представление ... на случай, если данные пустые, я хочу выскочить представление, если данные не пустызатем я хочу загрузить представление для отображения его в стеке навигации.

, поэтому в моем tableView: didSelectRowAtIndexPath: метод, когда выбор сделан, я получаю текущий идентификационный номер выбора, чтобы я мог ограничить значенияданных, которые я собираюсь проанализировать только для связанных значений.

Это то, как код выглядит внутри моего метода.

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
    ///... This stuff is for context.. 

            //Get the subview ready for use
            VSRViewController *vSRViewController = [[VSRViewController alloc] initWithNibName:@"VSRViewController" bundle:nil];
            //Sets the back button for the new view that loads (this overrides the usual parentview name with "Back")
            self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStyleBordered target:nil action:nil];
            //Pass Title over to subview
            vSRViewController.title = @"SubModel";

            //Selected cell gives restult to the subview or o the parent view to be displayed.. when the view is pushed or poped 
            NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"MODEL",cell.textLabel.text];
            filterArray = [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate];

            //Sets restriction string so that when subCacheData is parsed only values mathching modIdString will be parsed
            modIdString = [[filterArray valueForKey:@"MODID"] objectAtIndex:0]; //Restricts Mods dataset

            //This sets which if statment to enter in parserDidEndDocument
            dataSetToParse = @"ModID";
            [self startTheParsingProcess:modCacheData];

            //tempModArra is the array I get back from the parser that has had the restriction string applied to it
            if ([tempModArray count] == 0) {
                NSLog(@"POPVIEW"); //testing
                //pop this view to the parent view.. organize all the values that have to be sent back with protocols and delegates
            }else if ([tempModArray count] != 0){

                //Pass the selected object to the new view controller.
                [self.navigationController pushViewController:vSRViewController animated:YES];

                //Check if modIndexPath is same as selected if not remove accessory tick from the subview
                if (![modIndexPath isEqual:indexPath]){
                    submodIndexPath = nil;
                }
                [vSRViewController subModelCachedData:modCacheData indexPath:submodIndexPath dataSetToParse:@"ICSum" modelArray:filterArray modIndexPath:indexPath];

            //.....
            }
            }
    }
    //...

Этот код был отредактирован для удобства чтения, есть многодругие вещи, происходящие в нем ... поэтому некоторые вещи могут быть неправильными ... как я отредактировал некоторые имена ... но это должно быть хорошо ..

Это то, что происходит в моем делегате синтаксического анализатора.

- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    //.. other stuff up here.
    if (dataSetToParse == @"ModID") {
        //This applies the 
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K like %@",@"ModID",modIdString]; //modIdString restricts results that have been parsed
        NSArray *filteredArray = [parsedDataArrayOfDictionaries filteredArrayUsingPredicate:predicate];

        tempModArray = filteredArray;

        //what do I do here to get tempModArray back up to tableView:didSelectRowAtIndexPath: method.. this is where I am abit lost.
    }

}

Вот и все ... все работает, единственная проблема в том, что я не могу вернуть свой temoModArray обратно в tableView: didSelectRowAtIndexPath: поэтому мне нужна помощьЗадумка о решении.

Также для контекста я делаю это потому, что если в tempModArray нет значений, я бы хотел отправить пользователя обратно в родительское представление, чтобы они не видели пустое представление таблицы, когдаиду в подпредставление, чтобы сделать выбор .. надеюсь, что все это имеет смысл .. Я с нетерпением жду нашего ответа.

1 Ответ

1 голос
/ 26 января 2012

что мне делать здесь, чтобы вернуть tempModArray обратно в tableView: didSelectRowAtIndexPath: метод

Краткий ответ: нет.

didSelectRow уже сделал своюработа, которая должна сообщить приложению, что пользователь выбрал строку.Теперь у приложения есть работа.А именно, выяснить, будет ли он выдвигать новый контроллер представления с данными или нет.Так что не торопитесь, решите, есть ли данные, а затем вытолкните;скорее, не нажимайте в первую очередь, если нет данных.

В тот момент, когда ваш анализатор знает, есть ли у него данные или нет, у вас есть много вариантов.Я предполагаю, что ваш делегат парсера не входит в ваш класс контроллера табличного представления.Вы можете:

  • Опубликовать уведомление NSNotification, которое ожидает ваш контроллер табличного представления, и метод прослушивания может выдвинуть контроллер подробного представления, если есть данные, или не выполнять операции, если их нет.Вы можете передать массив в уведомлении.
  • Вызовите метод непосредственно на вашем контроллере табличного представления, чтобы передать контроллер подробного представления, передавая массив (объявите протокол в заголовке контроллера табличного представления и получите делегат анализатора).вызовите этот метод)
  • Выдвиньте контроллер детального вида непосредственно из синтаксического анализатора (что-то вроде icky)
  • Используйте KVO

imo метод протокола самый чистый,(слабая связь, но с хорошими именами), но каждому свое.

...