我已经解决了我的问题,这就是我解决它的方法。
在我得到答案之前,我对 Objective-C 和面向对象编程仍然很陌生,所以我的词汇不知道如何描述我尝试解释的一些事情。因此,在阅读本文时要考虑到这一点。
在时间模式下使用 UIDatePicker,即您进入您的 NIB/XIB 文件并将您的 UIDatePicker 对象设置为“时间”,只会返回时间。这就是我出错的地方。
使用 NSDateComponent 或任何 NSCalendar 方法将带出选择器的日期组件。例如,您将在 NSLog 返回中看到 1970 年 1 月 1 日。
我必须找到一种新的方法来计算我从选择器那里得到的时间。
我最终使用的是 NSTimeInterval、dateByAddingTimeInterval 和 timeIntervalSinceDate。研究表明 NSTimeInterval 也是一个浮点类型,所以我也用浮点数来做一些数学运算。
这是一个例子 -
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”语句被触发时,它将填充显示“Clock Out”的行的detailTextLabel。从视觉上看,“Clock Out”这一短语将位于行的左侧,时间将位于右侧。
diffClockInOutToLunch 被定义为 NSTimeInterval 类型。正在执行的操作是 timeIntervalSinceDate,它实质上是从 clockIn 的值中减去 outToLunch 的值。想象 outToLunch 是晚上 11:00,而 clockIn 是早上 6:00。这个差是5个小时。NSTimeInterval 仅将值存储为秒,因此 5 小时的差异为 18000 秒。
然后我使用浮点数执行正常的数学运算。在这种情况下,我想知道工作日还剩多少小时。这假设一天的工作时间是 8 小时。因为 NSTimeInterval 返回秒,所以我将 8 小时转换为秒(28,800 秒),然后从 28800 中减去 diffClockInOutToLunch。现在剩余的InTheDay 等于 10800,即 3 小时。
我执行的下一个操作是将clockOut 设置为我们工作日结束的时间。为此,我使用 dateByAddingTimeInterval 操作,它也是一个 NSDate 方法,因此它返回的任何内容都将采用日期/时间格式。在此操作中,我们将剩余的InTheDay(10,800 秒)添加到 inFromLunch(例如上午 11:30)。我们的clockOut 时间现在是下午2: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(设置为时间模式)管理时间的方式。
简短的回答是我使用错误的方法来处理我的选择器正在转动的东西。
我希望这对您有所帮助,如果我再次需要它,希望它会在这里;)