【问题标题】:How to swap between UIViews inside a UIViewController?如何在 UIViewController 内的 UIView 之间进行交换?
【发布时间】:2014-04-02 20:11:48
【问题描述】:

我创建了 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];
    }
}

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

【问题讨论】:

  • 希望我的回答能帮到你。

标签: ios objective-c uiview uipickerview uipickerviewdelegate


【解决方案1】:

首先,也许为了让它更漂亮,你可以考虑一个 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;
    }
}

【讨论】:

    【解决方案2】:

    我有一个应用程序,它有一个占位符 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];
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多