UIDatePicker, время и 1970 - PullRequest
       18

UIDatePicker, время и 1970

1 голос
/ 20 мая 2011

Я столкнулся с небольшой проблемой, которую я жевал уже день или два.

Используя пример проекта Apple под названием DateCell, я поднял его UIDatePicker и установил его на время. Я использовал этот конкретный код, как и анимированный слайд на экране.

Мой рабочий процесс заключается в установке четырех значений: времени начала, времени обеда, времени обеда и времени остановки. Я установил эти значения с помощью [NSDate date].

Затем я использую NSCalander: вызовы компонентов для выполнения некоторой математики, такой как «добавьте 30 минут, чтобы начать время, чтобы получить время обеда», и «Время начала - время обеда - 8 часов, чтобы получить время остановки».

Первоначальная настройка проходит отлично. Нажатие на ячейку времени начала вызывает сборщик и выбирает изменение времени три раза, следуя моей простой математической формуле.

Если выбран второй ряд, время обеда истекло, снова появится колесо, чтобы выбрать время ожидания обеда. Однако здесь начинаются мои проблемы. Кажется, что мое колесо UIDatePickerModeTime возвращает часть даты за 1 января 1970 года. И эта часть даты, которая испортила мои математические формулы.

Мой вопрос: что я могу сделать, чтобы это исправить?

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

Я пытался настроить методы класса initWithTimeInterval, но они блокируют время, и я думаю, это не то, что я ищу.

Я также пробовал вызовы NSDateFormatter: stringFromDate | dateFromString, и они не оказали никакого влияния.

Что я еще не сделал:

Пользовательская строка даты / времени.

Перестройка UIDatePicker: время с нуля

Я что-то смотрю?

Спасибо.

1 Ответ

1 голос
/ 24 мая 2011

Я решил свою проблему, и вот как я ее решил.

Прежде чем я получу свой ответ, я все еще новичок в Objective-C и объектно-ориентированном программировании, поэтому мой словарь незнаю, как описать некоторые вещи, которые я пытался объяснить.Поэтому примите это во внимание при чтении этого.

Использование UIDatePicker в режиме времени, то есть вы заходите в свой файл NIB / XIB и устанавливаете для своего объекта UIDatePicker значение «время», будет возвращаться только время.Вот где я ошибся.

Использование NSDateComponent или любого из методов NSCalendar выведет компонент даты средства выбора.Таким образом, вы увидите 1 января 1970 года, например, в результатах NSLog.

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

В итоге я использовал NSTimeInterval, dateByAddingTimeInterval и timeIntervalSinceDate.Исследование показало, что NSTimeInterval также является типом с плавающей точкой, поэтому я использовал float для некоторой математики.

Вот пример -

if (indexPath.row == [labelArray indexOfObjectIdenticalTo:@"Clock Out"])
    {        
        NSTimeInterval diffClockInOutToLunch = [outToLunch timeIntervalSinceDate:clockIn];
        float remainingInTheDay = 28800 - diffClockInOutToLunch;

        self.clockOut = [inFromLunch dateByAddingTimeInterval:remainingInTheDay];

        cell.detailTextLabel.text = [self.dateFormatter stringFromDate:clockOut];

        self.clockOutIndex = indexPath;

        return cell;
    }

Я использую TableView для отображения моих полей,Когда этот оператор 'if' сработает, он заполнит detailTextLabel строки, отображающей "Clock Out".Визуально фраза «Clock Out» будет находиться с левой стороны строки, а время - с правой стороны.

diffClockInOutToLunch определен как тип NSTimeInterval.Выполняемая операция - это timeIntervalSinceDate, которая по существу вычитает значение outToLunch из значения clockIn.Представьте, что OutToLunch - это 11:00 вечера, а часы - как 6:00 утра.Эта разница составляет 5 часов.NSTimeInterval сохраняет значения только в секундах, поэтому эта разница в 5 часов составляет 18000 секунд.

Затем я выполняю обычную математическую операцию с использованием float.В этом случае я хочу узнать, сколько часов осталось в рабочем дне.Это предполагает, что часы, отработанные в течение дня, составляют 8 часов.Поскольку NSTimeInterval возвращает секунды, я конвертировал 8 часов в секунды (28 800 секунд), а затем вычитал diffClockInOutToLunch из 28800. Теперь оставшийсяInTheDay равен 10800 или 3 часам.

Следующая выполняемая мной операция устанавливает для ClockOut значениевремя наш рабочий день закончен.Для этого я использую операцию dateByAddingTimeInterval, которая также является методом NSDate, поэтому все, что она возвращает, будет в формате даты / времени.В этой операции мы добавляем остаток inTheDay (10 800 секунд) к inFromLunch (например, в 11:30).Наше время clockOut теперь 14:30, которое затем отправляется через мой DateFormatter и возвращается в виде строки в ячейку TableView, а также сохраняется для дальнейшего использования.

Вот еще один пример, приведенный ниже в моем коде -

- (void)clockInChanged
{
    // Set clockIn value
    self.clockIn = self.pickerView.date;

    // Change the outToLunch time
    self.outToLunch = [self.pickerView.date dateByAddingTimeInterval:5*60*60];

    UITableViewCell *outToLunchCell = [self.tableView cellForRowAtIndexPath:outToLunchIndex];
    outToLunchCell.detailTextLabel.text = [self.dateFormatter stringFromDate:outToLunch];

    // Change the inFromLunch time
    self.inFromLunch = [outToLunch dateByAddingTimeInterval:30*60];

    UITableViewCell *inFromLunchCell = [self.tableView cellForRowAtIndexPath:inFromLunchIndex];
    inFromLunchCell.detailTextLabel.text = [self.dateFormatter stringFromDate:inFromLunch];

    // Change the clockOut time
    NSTimeInterval diffClockInOutToLunch = [outToLunch timeIntervalSinceDate:clockIn];
    float remainingInTheDay = 28800 - diffClockInOutToLunch;

    self.clockOut = [inFromLunch dateByAddingTimeInterval:remainingInTheDay];
    UITableViewCell *clockOutCell = [self.tableView cellForRowAtIndexPath:clockOutIndex];
    clockOutCell.detailTextLabel.text = [self.dateFormatter stringFromDate:clockOut];
} 

В этом примере мы ранее определили, что была выбрана строка, относящаяся ко времени "Clock In" (если хотите, "Touch Up Inside"), и мы перейдем к этому методу.

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

Этот пример показывает, что мы фиксируем значение в средстве выбора(self.pickerView.date) как clockIn.Затем мы используем clockIn, чтобы заполнить наш беспорядок dateByAddingTimeInterval и т. Д.

Итак.Вот как я управлял своим временем, используя UIDatePicker (который установлен в режиме времени).

Короткий ответ: я использовал неправильные методы для работы с тем, что поворачивал мой сборщик.

Надеюсь, это поможет вам, и, надеюсь, оно будет здесь, если оно мне снова понадобится;)

...