【问题标题】:Moved identical code from IBAction to method--produces different behavior将相同的代码从 IBAction 移动到方法——产生不同的行为
【发布时间】:2014-08-10 21:41:45
【问题描述】:

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

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

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

问题在于,在更改之前,条形上方的两个标签(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;

如此直接的更改会导致这种效果似乎不合理。我已经尝试了几次以确保我没有破坏任何东西,而且似乎我没有。

有什么想法吗?

【问题讨论】:

  • 您是否尝试将代码移动到 viewWillAppear 或 viewDidAppear?把它放在那里会更像你的原始实现(在时间方面)。可能是,通过从委托方法调用方法,框架尚未设置(不清楚您从哪里调用方法)?
  • 你是指完成块中的代码,还是整个动画,还是在viewDidLoad中调用makeBarChart?我刚刚测试了“完成”,顺便说一句,它记录为 0。“makeBarChart”方法由委托之后的另一个方法调用(并且经过一些相当大的算术)。
  • 我在想,把你原来在按钮方法中的所有代码都放在 viewDidAppear(不是 viewDidLoad)中,只是因为一切都应该处于与单击按钮时相同的状态.不过,您可能需要某种标志,因此在视图首次出现时不会发生(如果您不希望这样的话)。
  • 因为我确实使用这个 VC 以两种不同的方式显示两种不同类型的数据,所以我只是在“if”条件下调用包含(前)按钮代码的方法,并在viewDidLoad。就目前的情况而言,它工作不正常(有点倒退或其他什么),但我会在放弃它之前把它弄乱一点。当我做对了,或者当我放弃时,我会发布结果,以先到者为准。感谢您的建议——他们很好。
  • @rdelmar--我刚刚注意到你说 viewDidAppear。该死的,我只是在删除按钮之前备份了一个快照,但会用 viewDidAppear 再试一次。抱歉我的疏忽!

标签: ios objective-c animation uiview ibaction


【解决方案1】:

尝试将 "completion:^(BOOL finished)" 块中的所有代码放入 if 语句中:

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

【讨论】:

    【解决方案2】:

    按照@rdelmar 在评论中的建议,通过将代码调用从viewDidLoad 移到`viewDidAppear 中,将代码调用从以前的按钮操作方法(重构为showGraph)解决了。非常感谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多