我是xcode和objective-c编程的新手,但我是一个快速学习者和顶尖的Google员工,所以通过研究和论坛梳理,设法避免了我自己的问题。我现在遇到的问题是如此荒谬,我甚至无法思考如何在不将其作为一个愚蠢的帖子的情况下提出问题,对此抱歉,这就是......
我正在开发一款iPhone应用程序,它基本上是一个社交工作者的日常清单/日志,其客户端处于自闭症/阿斯伯格谱的较高端。它是为他们跟踪必须每天完成的常规任务列表,例如卫生程序,药物,睡眠时间,工作时间等......还有一个历史功能可以查看过去几天,以及摘要页面可查看所选时间段的总体平均值,因此她可以监控其进度。摘要页面是我遇到问题的地方,所以我会尽力描述它。
摘要页面包含一个小日期选择面板和主要摘要表。在开始时,选择面板位于屏幕中间,而桌面位于可见屏幕下方。选择面板打开一个选择器以选择"到" "来自"日期。选择两个日期后,拾取器关闭,面板和表格都向上动画(面板到屏幕顶部,表格填充其余部分)。摘要页面可以用两种不同的方式调用,第一种方法是通过选择器手动选择日期,第二种方法是从历史记录页面中选择一个特定的星期,自动填充日期并触发动画。
直到昨晚,这一切都完美无瑕。我在摘要页面添加了一堆代码,以便获得更准确的时间平均值,并包含每天可选的第二个工作块。所有代码都完全符合它的预期,但是当手动选择日期时,一条特定的行似乎已经破坏了面板/表格动画。请注意,从历史记录页面自动选择日期时,它仍然可以正常工作。但是当手动选择日期时,在选择第二个日期时,选择器会关闭,但动画不会发生。根据我投入的NSLogs的淫秽数量,每日数据正在收集并且数学正在进行中,一切都在做他们应该做的事情,期望面板不移动,所以你看不到任何一个。最疯狂的部分是我甚至添加了NSLogs来告诉我选择之前和之后面板的frame.origin.y位置,以及那些正确显示,就像在应用程序中那样他们将面板移动到他们所在的位置#39 ;应该是(在y = 570之前,y = 36之后),但在视觉上,没有任何事情发生过X(
这是负责打破动画的代码块,指出了罪魁祸首。该函数负责创建一个数组,其中包含"工作块1"每天以分钟为单位的总工作时间。该数组的对象稍后被添加到"工作块2"数组,然后找到每天的平均工作时间。
if ([self.workBeginTimes firstObject] != nil) {
self.totalWork1InMin = [NSMutableArray array];
for (NSInteger i = 0; i < self.workBeginTimes.count; i++) {
if ([[self.workBeginTimes objectAtIndex:i] isEqual:@"X"]) {
// if no work found in that day's log, add "0" to time array
[self.totalWork1InMin addObject:[NSNumber numberWithInteger:0]];
}
else if (![[self.workBeginTimes objectAtIndex:i] isEqual:@"X"]) {
// work time found, send work start/stop times to separate method that finds the time interval difference
NSDate *workBeginTimeDate = [self.workBeginTimes objectAtIndex:i];
NSDate *workEndTimeDate = [self.workEndTimes objectAtIndex:i];
[self timeDiffInMinutesFrom:workBeginTimeDate to:workEndTimeDate];
// NSLog(@"i break here");
// the culprit line is responsible for adding the result time to the time array
[self.totalWork1InMin addObject:[NSNumber numberWithInteger:timeDiffMinutes]];
}
}
}
只要我评论出最后一行,一切都很好。我甚至尝试过其他代码的随机片段,例如NSLogs或随机整数/数学函数等...它并不重要我使用它,它总是有效,当我尝试将时间添加到数组时执行。我甚至尝试将它放入一个单独的方法并从循环中调用它,但动画仍然会中断。如果我删除if-else语句,它再次正常工作。所以在特定的if-else语句中有关于该特定行的内容。我知道 - 我也感到困惑。在任何人问之前,是的 - 这个街区是至关重要的。我找不到真正无法解决的问题。如果这个块不是这样的话,那么所有剩下的数学都不再准确。我需要if-else语句,以便在2个数组(工作块1 /工作块2)中始终存在相同数量的项目,因此可以计算关闭日期(&#34; 0&#34;)
对于这篇冗长的帖子感到抱歉,并提前感谢SOOO提出任何想法,提示和建议:)
修改 哎呀,我忘了包括我调用的方法和它返回的变量:
[self timeDiffInMinutesFrom:workBeginTimeDate to:workEndTimeDate];
从类的超类中调用此方法:
- (void)timeDiffInMinutesFrom:(NSDate *)time1 to:(NSDate *)time2 {
NSDateComponents *timeDiffMin = [[NSCalendar currentCalendar]
components:NSMinuteCalendarUnit
fromDate:time1
toDate:time2
options:0];
timeDiffMinutes = [timeDiffMin minute];
}
NSInteger timeDiffMinutes;
是一个全局变量(我知道,我知道!),因为这是一个我必须从几个不同的子类多次调用的方法。我知道有一种更简洁的方式可以来回传递这些信息 - 但是不管这点是这样的方式现在还可以,而且我的电话或变量不是& #39;造成这个奇怪的问题。只要注释掉self.totalWork1InMin addObject:...
行,它就可以使用并继续工作。我将通过说我使用相同的调用/变量/ addObject循环来查找总数&#34;睡眠时间&#34;总计&#34;工作块2&#34;倍。 &#34;睡眠时间&#34; call不在if-else语句中,但是&#34;工作块2&#34;在一个内部调用IS,这些调用都不会影响动画。我不知道为什么它只是&#34;工作区1&#34;循环,只有当在if-then语句中时,但它肯定是这样的: - \
编辑2 在收集完所有数据并完成数学运算后调用动画:
[self makeSelectionDict]; // initiates series of methods gathering data and doing math
[self closePicker:nil]; // closes Picker
if (SummaryTable.frame.origin.y == 570) {
[self tableViewPosition]; // <<---this line calls the table animation
}
if语句检查表是否在可见屏幕下方。如果已经显示表而不重新调用动画,则可以修改选择日期。
这是动画方法:
- (void)tableViewPosition {
CGRect selectionFrame = [SelectionView frame];
CGRect tableFrame = [SummaryTable frame];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelay:0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[SelectionView setFrame:CGRectMake(selectionFrame.origin.x,
selectionFrame.origin.y - 190,
selectionFrame.size.width,
selectionFrame.size.height)];
[SummaryTable setFrame:CGRectMake(tableFrame.origin.x,
tableFrame.origin.y - 536,
tableFrame.size.width,
tableFrame.size.height)];
[UIView commitAnimations];
}