UINavigationController + UITabBarController + UISegmentedControl с TableView / MapView - PullRequest
0 голосов
/ 24 декабря 2011

Я занимаюсь обучением работе с фотографиями с Flickr. Я хочу показать самые популярные места и связанные с ними фотографии.На данный момент в приложении есть TabBarController, а каждая вкладка имеет контроллер навигации в качестве «отправной точки».Раскадровка выглядит так: [Таблица мест] -> [Таблица фотографий] -> [Прокрутка изображения] Теперь я хотел бы дать пользователю возможность переключиться на представление карты вместо представления таблицы безделаю дальнейшие шаги.

Я думаю, что лучший способ сделать это - использовать UISegmentedControl, поэтому я использовал этот макет [ссылка на изображение] .Когда таблица видима, карта скрыта (и наоборот).

Используя только табличное представление, я использовал TableViewController.С этими изменениями я подклассифицировал UIViewController и реализовал «вручную» два протокола таблицы (delegate и datasource), я связал выходы, но теперь прокрутка таблицы имеет низкую частоту кадров .

Я спрашиваю flickr самое популярное место, я разделяю JSON и получаю NSArray из NSDictionary s, который я назвал «местах» (каждый словарь = место).Затем я разделил эти места по разделам по странам: список стран (в алфавитном порядке) называется 'sortedCountries'.Затем я создал NSDictionary под названием «placeByCountry» (ключ = страна / значение = массив мест для этой страны).

Вот код, который я написал:

- (NSArray*)addressForPlace:(NSDictionary*)place {
    return [[place objectForKey:@"_content"] componentsSeparatedByString:@", "]; }

- (NSString *)countryForSection:(NSInteger)section {
return [self.sortedCountries objectAtIndex:section]; }

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return [self countryForSection:section]; }

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [self.placesByCountry count]; }

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    NSString *country = [self countryForSection:section];

    NSArray *placesByCountry = [self.placesByCountry objectForKey:country];

    return [placesByCountry count]; }

- (UITableViewCell *)tableView:(UITableView *)tableViewLocal cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Top Place Cell";

    UITableViewCell *cell = [tableViewLocal dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...

    NSString *country = [self countryForSection:indexPath.section];
    NSArray *placesByCountry = [self orderedPlacesForCountry:country];

    NSDictionary *place = [placesByCountry objectAtIndex:indexPath.row];

    NSArray *address = [self addressForPlace:place];
    cell.textLabel.text = [address objectAtIndex:0];

    NSMutableString *remainigAddres = [NSMutableString string];
    for (NSString *s in address) {
        if ([address indexOfObject:s] != 0) {
            if ([address indexOfObject:s] != [address indexOfObject:[address lastObject]])
                [remainigAddres appendFormat:@"%@, ", s];
            else
                [remainigAddres appendString:s];
        }
    }
    cell.detailTextLabel.text = remainigAddres;


    return cell; }

Это правильный подход для моей проблемы?Что я должен сделать, чтобы улучшить показатели ?Я только что проверил идентификатор ячейки, а картинки не для загрузки!Единственная асинхронная очередь происходит в начальной совокупности таблицы (когда я запрашиваю flickr) ..

РЕДАКТИРОВАТЬ: возможно, я обнаружил проблему ... прокрутка таблицы имеет низкую частоту кадров, особенно при прокрутке больших разделов .. какВы можете видеть, в tableView: cellForRowAtIndexPath: метод, я вызываю другой метод orderPlacesForCountry :.Этот метод выполняет сортировку на лету:

- (NSArray*)orderedPlacesForCountry:(NSString*)country {
    NSArray* places = [self.placesByCountry objectForKey:country];
    if (DEBUG_LOG_ACTIVE) NSLog(@"places: %d", [places count]);

    NSMutableArray* cities = [NSMutableArray array];
    for (NSDictionary* place in places) {
        [cities addObject:[[self addressForPlace:place] objectAtIndex:0]];
    }
    if (DEBUG_LOG_ACTIVE) NSLog(@"cities: %d", [cities count]);

    NSArray *sortedCities = [cities sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
    if (DEBUG_LOG_ACTIVE) NSLog(@"sorted cities: %d", [sortedCities count]);

    NSMutableArray *sortedPlaces = [NSMutableArray arrayWithCapacity:[places count]];

    for (NSString* city in sortedCities) {
        //per ogni città cerco in places quel place
        for (NSDictionary* place in places) {
            if ([[[self addressForPlace:place] objectAtIndex:0] isEqualToString:city])
                //e lo aggiungo a sorted
                [sortedPlaces addObject:place];
        }
    }

    if (DEBUG_LOG_ACTIVE) NSLog(@"sorted places: %d", [sortedPlaces count]);

    return sortedPlaces; }

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

1 Ответ

0 голосов
/ 24 декабря 2011

С небольшой информацией, которую вы нам предоставляете, я полагаю, что фрагмент кода, который замедляет работу вашей таблицы, это ваши клетки, вы показываете какие-то изображения в клетке?если да, вы загружаете их синхронно?Вы вставляете веб-просмотры или большие текстовые просмотры внутри ячейки?

Это такие вещи, которые могут замедлять работу таблицы, пожалуйста, добавьте больше информации, чтобы помочь вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...