如何在UIViewController内部交换UIViews?

时间:2014-04-02 20:11:49

标签: ios objective-c uiview uipickerview uipickerviewdelegate

我创建了8个UIViews,我有一个UIPicker,当用户选择UIPicker的内容时,我通过一个很大的if语句运行该线程,我不满意。

我想知道我在做什么是好的吗?如果我用来加载视图的代码是应该如何完成的..代码在下面你会看到我只是加载UIView一次,然后把它带到前面层......我宁愿使用从子视图中移除来完全重新加载...但我无法让它工作..

UIViews中的任何一个都可以一次加载,这就是造成我问题的原因。

#pragma mark - Picker Delegates
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    // ReloadView
    if (row == 0) {
        if (my1View == nil ) {
            [self DrawView1];
        }
        [self.view bringSubviewToFront:my1View];
    } else if (row == 1) {
        if (my2View == nil ) {
            [self DrawView2];
        }
        [self.view bringSubviewToFront:my2View];
    }else if (row == 2) {
        if (my3View == nil ) {
            [self DrawView3];
        }
        [self.view bringSubviewToFront:my3View];
    }else if (row == 3) {
        if (my4View == nil ) {
            [self DrawView4];
        }
        [self.view bringSubviewToFront:my4View];
    }else if (row == 4) {
        if (my5View == nil ) {
            [self DrawView5];
        }
        [self.view bringSubviewToFront:my5View];
    }else if (row == 5) {
        if (my6View == nil ) {
            [self DrawView6];
        }
        [self.view bringSubviewToFront:my6View];
    }else if (row == 6) {
        if (my7View == nil ) {
            [self DrawView7];
        }
        [self.view bringSubviewToFront:my7View];
    }else if (row == 7) {
        if (my8View == nil ) {
            [self DrawView8];
        }
        [self.view bringSubviewToFront:my8View];
    }
}

唯一的另一个问题是,有时它会卡在一个视图上,无论我选择什么都不会加载它。

3 个答案:

答案 0 :(得分:0)

首先,也许是为了让它更漂亮,你可以考虑一下switch语句,但就性能而言,这并不重要:

switch (row) {
        case 0:
            if (my1View == nil ) {
                [self DrawView1];
            }
            [self.view bringSubviewToFront:my1View];
            break;
        case 1:
            if (my1View == nil ) {
                [self DrawView2];
            }
            [self.view bringSubviewToFront:my2View];
            break;

           //THE OTHER CASES HERE...

        default:
            break;
}

关于其余部分: 我建议你将所有视图放入数组或字典中,并且还有一个变量currentView

@property (nonatomic, strong) UIView* currentView;
@property (nonatomic, strong) NSMutableDictionary* myViews;

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    // ReloadView
    UIView* myNewView =
    [self.myViews objectForKey:[NSString stringWithFormat:@"%d",(int)row]];

    if (myNewView!=self.currentView) {
        [self.currentView removeFromSuperview];
    }
    if (!myNewView) {
        [self drawView:row];
    }
    [self.view addSubview:myNewView];
    self.currentView = myNewView;
}

确保在viewDidLoad(或类似内容)中启动myViews属性,如下所示:

self.myViews = [NSMutableDisctionary new];

此行还需要一个新方法:[self drawView:row];,您可以在此处调用现有方法或将现有方法复制到此方法中!

为了尽可能少地改变,您可以使用:

- (void)drawView:(NSInteger)row
{
    switch (row) {
        case 0:
            [self DrawView1];
            break;
        case 1:
            [self DrawView2];
            break;

            //THE OTHER CASES HERE...

        default:
            break;
    }
}

答案 1 :(得分:0)

我有一个应用程序,它有一个占位符UIView(self.mainView),可以根据选项卡选项放置viewControllers。使用这种技术很好,因为之后只有1个视图被加载,我可以创建一个ViewController类,该类使用该视图进行操作,而不是需要了解可能在该位置的所有视图的单片控制器。

以下是一些示例代码,用于向该占位符显示相应的viewController。

@property (weak, nonatomic) IBOutlet UIView *mainView;
@property (strong) UIViewController *currentController;

if (self.currentController) {
    [self.currentController willMoveToParentViewController:nil];
    [[self.currentController view] removeFromSuperview];
    [self.currentController removeFromParentViewController];
    self.currentController = nil;
}


switch (row) {
    case 0:
        self.currentController = [self.storyboard instantiateViewControllerWithIdentifier:@"AboutViewController"];
        break;

    case 1: {
        ...
    }
        break;
}


if (self.currentController) {
    [self addChildViewController:self.currentController];
    [self.mainView addSubview:self.currentController.view];
    [self.currentController didMoveToParentViewController:self];
    [self adjustMainView]; // my own method to adjust some constraints base on flags
    [self.view layoutIfNeeded];
}

答案 2 :(得分:0)

我开发了您的项目,但我无法在您的代码中看到问题。工作良好。您正在显示的代码没有问题。也许您应该共享更多代码来检查它。

我试着追随你的风格,但我改变了小事。

您可以找到我创建的项目来测试您的代码here