Форматирование даты внутри заголовка раздела uitableview, ПОЖАЛУЙСТА, ПОМОГИТЕ - PullRequest
4 голосов
/ 01 декабря 2009

Позвольте мне вначале сказать, что я ОЧЕНЬ новичок в разработке для iphone, но я очень стараюсь учиться, поэтому любая помощь, которую любой из вас, профессионалов, готов поделиться, очень ценится! Так что у меня есть вопрос, который был бы ТАК удивительным, если бы кто-то мог ответить за меня Я изучаю еще несколько основных данных и использую пример основных данных с веб-сайта Apple для разработчиков, найденный здесь . Это довольно прямолинейное приложение, но я пытаюсь что-то изменить, и я не могу понять, как это сделать, и это сводит меня с ума !!! Собственно, приложение показывает автора в заголовке раздела табличного представления с заголовком в ячейке. Я хотел бы изменить это и установить дату авторского права (один из атрибутов книги) в качестве заголовка раздела. Прямо сейчас я могу заставить это показать, но это показывает дату в этом формате:

2009-12-01 10:11:31 -0700

Но это не тот формат, я хотел бы использовать этот формат:

вторник, 1 декабря

Вероятно, используя этот код:

NSDateFormatter * outputFormatter = [[NSDateFormatter alloc] init];

[outputFormatter setDateFormat: @ "EEEE MMMM d"];

NSString * date = [outputFormatter stringFromDate: [NSDate date]];

но проблема в том, что значение даты поступает из средства выбора даты, и я не могу понять (со всем этим безумным «ключевым» делом), как отформатировать значение даты, полученное из средства выбора, и поместить его на заголовок раздела. Если у вас есть какое-то время, чтобы перейти по ссылке на сайт Apple выше и ковыряться, пока вы не ответите на мою дилемму, ЭТО БЫЛО ТАК ОЦЕНОЧНО !!!! Спасибо.

Хорошо, вот мой код, который я вставил в метод сохранения:

 // Pass current value to the edited object, then pop.
if (editingDate) {
    NSString *rawDate = (NSString *)datePicker.date;
    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
    [outputFormatter setDateFormat:@"yyyy-MM-dd"];
    NSDate *date = (NSDate *)[outputFormatter dateFromString:rawDate]; 

    [outputFormatter setDateFormat:@"EEEE MMMM d"];
    NSString *formattedDateStr = (NSString *)[outputFormatter stringFromDate:date];

    [editedObject setValue:(NSDate *)formattedDateStr forKey:editedFieldKey];
}

А потом по какой-то причине дата просто не сохранится в приложении, и компилятор выдает эту ошибку:

Отладчик вышел со статусом 0. [Сессия началась в 2009-12-02 09:51:26 -0700.] 2009-12-02 09: 51: 47.342 CoreDataBooks [17981: 20b] * - [__NSCFDate length]: нераспознанный селектор отправлен на экземпляр 0x3e79850 2009-12-02 09: 51: 47.343 CoreDataBooks [17981: 20b] * Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «*** - [__NSCFDate length]: нераспознанный селектор, отправленный экземпляру 0x3e79850»

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

1 Ответ

4 голосов
/ 01 декабря 2009

Вам не нужно беспокоиться о ключевых делах, чтобы хотя бы изменить формат даты здесь. Свойство copyright в объекте book автоматически изменяется с помощью key-business в EditingViewController.

Таким образом, вам нужно только изменить место, где отображается это свойство. В DetailViewController.m измените этот метод:

- (NSDateFormatter *)dateFormatter {    
    if (dateFormatter == nil) {
        dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateStyle:NSDateFormatterMediumStyle];  //REMOVE
        [dateFormatter setTimeStyle:NSDateFormatterNoStyle];  //REMOVE
    }
    return dateFormatter;
}

К этому:

- (NSDateFormatter *)dateFormatter {    
    if (dateFormatter == nil) {
        dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"EEEE MMMM d"];  //NEW LINE
    }
    return dateFormatter;
}

Редактировать: Забыл упомянуть, что фактическое отображение выполняется в cellForRowAtIndexPath в том же файле. Но этот код отображения использует переменную уровня класса dateFormatter, поэтому мы просто изменим ее инициализацию.

Редактировать # 2: Вы изменили пример кода, чтобы сгруппировать строки по дате авторского права на книгу. Чтобы изменить формат даты в заголовке раздела, возможно, есть более элегантный способ сделать это, но вот грубое решение. Измените titleForHeaderInSection в RootViewController.m на это:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    NSString *rawDateStr = [[[fetchedResultsController sections] objectAtIndex:section] name];

    //convert default date string to NSDate...
    NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZ"];
    NSDate *date = [formatter dateFromString:rawDateStr];

    //convert NSDate to format we want...
    [formatter setDateFormat:@"EEEE MMMM d"];
    NSString *formattedDateStr = [formatter stringFromDate:date];

    return formattedDateStr;
}

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

Редактировать # 3: Поле авторского права - NSDate, которое содержит дату и время. Чтобы сгруппировать только по дате, когда поле авторского права редактируется, установите для временной части значение 00 следующим образом (в методе сохранения в EditingViewController.m):

    // Pass current value to the edited object, then pop.
if (editingDate) {
    NSDate *pickedDateTime = datePicker.date;

    NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
    [formatter setDateFormat:@"yyyy-MM-dd 00:00:00 -0000"];
    NSString *pickedDateStr = [formatter stringFromDate:pickedDateTime];
    pickedDateTime = [formatter dateFromString:pickedDateStr];

    [editedObject setValue:pickedDateTime forKey:editedFieldKey];
}

ОДНАКО, поскольку образец данных, представленных в примере от Apple, уже включает время в поле авторского права, редактирование или добавление одной книги не поместит ее в ту же группу, что и другая группа с такой же датой, поскольку в другой книге все еще есть доля времени в нем. Если вы отредактируете обе книги и сохраните их, в обоих случаях будет очищено время, и они будут отображаться в одной группе.

Лучшим решением было бы как-то сказать SortDescriptor, чтобы он смотрел только на часть данных об авторском праве, а не об авторском праве как есть, но я пока не уверен, как это сделать.

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