Ios 将相同的代码从iAction移动到方法--产生不同的行为

Ios 将相同的代码从iAction移动到方法--产生不同的行为,ios,objective-c,animation,uiview,ibaction,Ios,Objective C,Animation,Uiview,Ibaction,我有一个似乎多余的按钮。我想删除该按钮并将其功能(为带有相关标签的简单条形图制作动画)放入一个方法中,该方法在从用户输入视图控制器返回时调用 重命名现有的iAction方法并将对替换方法的调用放入委托方法中似乎足够简单,委托方法将处理转换回原始视图控制器。然而,这产生了一个意想不到的结果 这是一个截图。有问题的按钮是红色的(显示图形): 问题是在更改之前,条上的两个标签(firstLabel和secondLabel)将在条动画设置到位后显示。方法更改后(创建代码不变),标签在返回到VC后立即出

我有一个似乎多余的按钮。我想删除该按钮并将其功能(为带有相关标签的简单条形图制作动画)放入一个方法中,该方法在从用户输入视图控制器返回时调用

重命名现有的iAction方法并将对替换方法的调用放入委托方法中似乎足够简单,委托方法将处理转换回原始视图控制器。然而,这产生了一个意想不到的结果

这是一个截图。有问题的按钮是红色的(显示图形):

问题是在更改之前,条上的两个标签(
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重试。对不起,我疏忽了!