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

时间:2014-08-10 21:41:45

标签: ios objective-c animation uiview ibaction

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

重命名现有的IBAction方法并将对替换方法的调用放入委托方法来处理转换回原始View控制器似乎很简单。然而,这产生了意想不到的结果。

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

enter image description here

问题在于,在更改之前,条形图上的两个标签(firstLabelsecondLabel)会在条形图中显示为。方法更改后(创建代码未更改),标签会在返回VC后立即显示,之前条形图为动画。

这是附在按钮上的原始IBAction方法:

- (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;

这种直接的改变会导致这种影响,这似乎是不合理的。我已经多次尝试过,以确保我没有破坏任何东西,似乎我不是。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

尝试将来自“completion:^(BOOL finished)”块的所有代码放在if语句中:

completion:^(BOOL finished) {
  if (finished) {
    // Do all that stuff, including make the label visible...
  }
}

答案 1 :(得分:0)

通过将@ {1}}中的前一个按钮操作方法(重构为showGraph)中的代码调用移动到`viewDidAppear中来解决问题,正如@rdelmar在评论中所建议的那样。非常感谢!