ViewController有太多代码行(重构选项)

时间:2015-04-24 12:55:51

标签: ios objective-c model-view-controller refactoring

我的ViewController看起来非常庞大,现在有500多行代码。 我想重构它并将一些方法放入外部类或类别中。

但我的很多方法都涉及IBOutlets或UIViewAnimation,为Storyboard的View元素设置动画,隐藏它们,改变不透明度等等。

将此类方法移出ViewController的最佳方法是什么?

- (void)animateBeforeNewRound;
- (void)animateBeforeNewGame;
- (void)animateBeforeFinishingTheGame;
- (void)presentSlidingView;

- (void)presentSlidingView {
    //preparing view constraint for animation
    __block float constr = 0;
    [self.view.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {

        if (constraint.firstItem == self.slideView && constraint.firstAttribute == NSLayoutAttributeLeading) {
            constr = constraint.constant;
            [constraint setConstant:0.0f];
        }
    }];

    [UIView animateWithDuration:0.1 animations:^{
        /* animate prepared constraint */
        [self.view layoutIfNeeded];
    } completion:^(BOOL finished) {
        /* animate constraints */
        [UIView animateWithDuration:0.1 delay:0.2 options:UIViewAnimationOptionTransitionNone animations:^{
            self.imgBubble.alpha = 1;
        } completion:^(BOOL finished) {
            /* update constraints back to initial value */
            [self.view.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
                if (constraint.firstItem == self.slide && constraint.firstAttribute == NSLayoutAttributeLeading) {
                    [constraint setConstant:constr];
                }
            }];
            [UIView animateWithDuration:0.1 delay:0.8 options:UIViewAnimationOptionTransitionNone animations:^{
                [self.view layoutIfNeeded];
            } completion:^(BOOL finished) {
                self.imgBubble.alpha = 0;
            }];
        }];
    }];
}

- (void)animate*方法与- (void)presentSlidingView非常相似,并与其他Storyboard的IBOutlets一起操作。

2 个答案:

答案 0 :(得分:0)

通常,使用单独的对象来处理单独的任务是个好主意。例如,您可以创建一个Animator类来处理所有-(void)animateXX方法。

你可以为处理代表做同样的事情。我通常使用自定义实例来处理所有UITableViewDataSource方法,因为它使我的Table View Controller类不那么杂乱。

关注点的分离对于将来的可维护性也很有用(例如:当你遇到与动画相关的问题时,你会发现第一个看起来就是你的动画师)。

Here是一篇关于此事的精彩文章。

答案 1 :(得分:0)

作为特定功能的建议:

  1. 为约束创建出口并且不要在代码中明确地搜索它们,对于这样的东西来说会更容易(对我来说):

    self.slideViewLeadingConstraint.Constant = 0.0f;

  2. 为动画创建辅助函数;

  3. 尝试使用ReactiveCocoa和/或ReactiveAnimation,我认为这有助于将所有链接调用分开,代码看起来更整洁;