IBAction по умолчанию - UISegmentControl, Справка по объектно-ориентированному проектированию - PullRequest
0 голосов
/ 24 июня 2011

У меня есть UISegmentControl с моим UITableView, который сортирует данные. Я хотел бы иметь возможность делать вещи:

(1) сортировка по умолчанию (поэтому, когда пользователь впервые включает приложение, он выбирает первый сегмент и сортирует по этому действию)

(2) помните, где пользователь находился между загрузками таблицы. Под этим я подразумеваю, что, подобно обложке Apple, когда я перехожу к другой обложке, UITableView заполняется заново. Так что, если в последний раз пользователь был там, сортировка была в 3-м сегменте, он запомнил бы это.

Я немного новичок в объектно-ориентированном дизайне, и я догадывался, что не везде должен быть один и тот же избыточный код: (MarkersList является NSMutableArray)

- (NSArray *)sortByName:(NSArray *)sortDescriptors {
    return [self.MarkersList sortedArrayUsingDescriptors:sortDescriptors];
}

- (NSArray *)sortByRSID:(NSArray *)sortDescriptors {
    return [self.MarkersList sortedArrayUsingDescriptors:sortDescriptors];
}

- (void)setSortedMarkersList:(NSArray *)sortedArray {
    if (self.MarkersList != nil) {
        [self.MarkersList removeAllObjects];
    }
    [self.MarkersList addObjectsFromArray:sortedArray];
}

- (IBAction)sortButtonPressed:(UISegmentedControl *)segmentControl {

    // Create sort descriptors
    NSSortDescriptor *nameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"Name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
    NSSortDescriptor *rsID = [[NSSortDescriptor alloc] initWithKey:@"ID" ascending:YES];

    if ([segmentControl selectedSegmentIndex] == NAME) { // this is #define 0 
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:nameDescriptor, rsIDDescriptor, nil];
        NSArray *sortedArray = [self sortByGene:sortDescriptors];
        [self setSortedMarkersList:sortedArray];
        [sortDescriptors release];

    }

    else if ([segmentControl selectedSegmentIndex] == RS_ID) {
        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:rsIDDescriptor, resultDescriptor, nameDescriptor, nil];
        NSArray *sortedArray = [self sortByRSID:sortDescriptors];
        [sortDescriptors release];
        [self setSortedMarkersList:sortedArray];
    }

    [self.MarkersTableView reloadData];
}

Третий вид еще не реализован, так как это не просто NSString или NSNumber, как два других. Пока, я думаю, что это работает правильно. Тем не менее, проблема у меня заключается в реализации (1), мне нужно будет вызвать sortByName, когда моя таблица загружена. Я мог бы просто создать NSSortDescriptors снова, но это кажется излишним. Есть ли более OOD способ достичь этого?

Для (2), я полагаю, я мог бы сохранить этот индекс для таблицы в словаре и извлечь его при загрузке этой таблицы. Или что-то в этом роде, не совсем уверен.

Любая помощь очень ценится. Спасибо!

1 Ответ

0 голосов
/ 24 июня 2011

Это не столько вопрос OO, как iOS не всегда позволяет нам использовать лучшие практики для решения проблемы.Я думаю, что лучшая ставка для вашей ситуации - хранить информацию о выбранном виде в NSUserDefaults .В вашем методе -viewDidLoad проверьте, существует ли выбранный объект сортировки в NSUserDefaults, используйте его, если он есть, и, если нет, выберите разумное значение по умолчанию.

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

Что касается # 2, вы можете использовать indexPathsOfVisibleRows в UITableView, чтобы получить массив видимых индексов, сохранить первый в UserDefaults, затем при загрузке (или всплыть из следующего контроллера представления, если это произойдет), вызвать –scrollToRowAtIndexPath: atScrollPosition: animated:.

После того, как ваш код заработает, я рекомендую вам посмотреть различные видео на iTunes U, касающиеся профилирования и инструментов.Это замечательный инструмент, который часто упускают из виду и действительно помогает сконцентрировать усилия там, где это необходимо.

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