Ios 将相同的代码从iAction移动到方法--产生不同的行为
我有一个似乎多余的按钮。我想删除该按钮并将其功能(为带有相关标签的简单条形图制作动画)放入一个方法中,该方法在从用户输入视图控制器返回时调用 重命名现有的iAction方法并将对替换方法的调用放入委托方法中似乎足够简单,委托方法将处理转换回原始视图控制器。然而,这产生了一个意想不到的结果 这是一个截图。有问题的按钮是红色的(显示图形): 问题是在更改之前,条上的两个标签(Ios 将相同的代码从iAction移动到方法--产生不同的行为,ios,objective-c,animation,uiview,ibaction,Ios,Objective C,Animation,Uiview,Ibaction,我有一个似乎多余的按钮。我想删除该按钮并将其功能(为带有相关标签的简单条形图制作动画)放入一个方法中,该方法在从用户输入视图控制器返回时调用 重命名现有的iAction方法并将对替换方法的调用放入委托方法中似乎足够简单,委托方法将处理转换回原始视图控制器。然而,这产生了一个意想不到的结果 这是一个截图。有问题的按钮是红色的(显示图形): 问题是在更改之前,条上的两个标签(firstLabel和secondLabel)将在条动画设置到位后显示。方法更改后(创建代码不变),标签在返回到VC后立即出
firstLabel
和secondLabel
)将在条动画设置到位后显示。方法更改后(创建代码不变),标签在返回到VC后立即出现,在条动画之前
以下是附加到按钮的原始iAction方法:
- (IBAction)goButtonAction:(id)sender
{
switch (goButtonKey)
{
case 0:
{
}
break;
case 1:
{
[self handleAvsAAction];
[self doTheMathAvsA];
[self makeBarChart];
}
break;
case 2:
{
[self handleCvsCAction];
[self doTheMathCvsC];
[self makeBarChart];
}
default:
break;
}
[self.goButton setUserInteractionEnabled:NO];
}
以下是新方法:
- (void) showGraph
{
switch (goButtonKey)
{
case 0:
{
}
break;
case 1:
{
[self handleAvsAAction];
[self doTheMathAvsA];
[self makeBarChart];
}
break;
case 2:
{
[self handleCvsCAction];
[self doTheMathCvsC];
[self makeBarChart];
}
default:
break;
}
[self.goButton setUserInteractionEnabled:NO];
}
下面是生成条形动画和标签的代码(来自makeBarChart
)。为简洁起见,我只展示了一个条形图——另一个基本相同,除了由不同的数据驱动:
switch (thisRiser.tag)
{
case 1:
{
[self.chartView addSubview:firstLabel];
[firstLabel setHidden:YES];
[UIView animateWithDuration:.6
delay:.2
options: UIViewAnimationCurveEaseOut
animations:^
{
// Starting state
thisRiser.frame = CGRectMake(35, self.chartView.frame.size.height, barWidth, 0);
thisRiser.backgroundColor = startColor1;
// End state
thisRiser.frame = CGRectMake(35, self.chartView.frame.size.height, barWidth, -focusBarEndHeight);
thisRiser.backgroundColor = endColor1;
thisRiser.layer.shadowColor = [[UIColor blackColor] CGColor];
thisRiser.layer.shadowOpacity = 0.7;
thisRiser.layer.shadowRadius = 4.0;
thisRiser.layer.shadowOffset = CGSizeMake(5.0f, 5.0f);
thisRiser.layer.shadowPath = [UIBezierPath bezierPathWithRect:thisRiser.bounds].CGPath;
}
completion:^(BOOL finished)
{
firstLabel.frame = CGRectMake(thisRiser.frame.origin.x, thisRiser.frame.origin.y - 65, barWidth, 60);
[firstLabel.titleLabel setFont:[UIFont boldSystemFontOfSize:12]];
firstLabel.titleLabel.numberOfLines = 0;
firstLabel.titleLabel.textAlignment = NSTextAlignmentCenter;
[firstLabel setTitle:[NSString stringWithFormat:@"%@\n%.2f%%\nTime--%@",focusItemName,focusItemPercent,actualDurationFocusItem] forState:UIControlStateNormal];
firstLabel.backgroundColor = [UIColor clearColor];
[firstLabel setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[firstLabel setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[firstLabel setHidden:NO];
[firstLabel addTarget:self action:@selector(firstLabelAction:) forControlEvents:UIControlEventTouchUpInside];
[firstLabel setUserInteractionEnabled:YES];
[thisRiser setUserInteractionEnabled:YES];
// NSLog(@"Done!");
}];
}
break;
如此直接的改变会造成这种影响,这似乎是不合理的。我已经试过好几次,以确保我没有打破任何东西,但似乎我没有
有什么想法吗 尝试将“completion:^(BOOL finished)”块中的所有代码放入if语句中:
completion:^(BOOL finished) {
if (finished) {
// Do all that stuff, including make the label visible...
}
}
正如@rdelmar在评论中建议的那样,通过将对代码的调用从以前的按钮操作方法(重构为showGraph)从
viewDidLoad
移动到`viewdidAppease,问题得以解决。非常感谢 您是否尝试过将代码移动到ViewWillDisplay或ViewDidDisplay?将它放在那里会更像您最初的实现(在时间方面)。可能是,通过从代理方法调用方法,帧尚未设置(不清楚从何处调用方法)?您是指完成块中的代码还是整个动画,还是在viewDidLoad中调用makeBarChart?我刚刚测试了“完成”,顺便说一句,它的日志记录为0。“makeBarChart”方法是由委托之后的另一个方法调用的(并且经过了一些相当多的运算)。我在想,将您最初拥有的所有代码都放在viewDidAppear(而不是viewDidLoad)中的button方法中,只是因为当您单击按钮时,所有内容都应该处于相同的状态。不过,您可能需要某种标志,这样当视图第一次出现时就不会发生这种情况(如果您不希望这样)。因为我确实使用此VC以两种不同的方式显示两种不同类型的数据,所以我只需在“if”条件中调用包含(前一种)按钮代码的方法,并在viewDidLoad中使用标志。就目前的情况来看,它并没有正常工作(有点倒退或什么的),但在放弃它之前,我会把它弄得一团糟。当我做对了,或者当我放弃的时候,我会发布结果,以先到者为准。谢谢你的建议——它们被采纳了。@rdelmar——我刚才注意到你说ViewDid出现了。该死,在删除按钮之前,我刚刚备份到快照,但将使用ViewDidDisplay重试。对不起,我疏忽了!