0

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

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

4

3 回答 3

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];
}
于 2014-04-03T13:21:37.150 回答
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;
}

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

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;
    }
}
于 2014-04-02T20:34:25.677 回答
0

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

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

您可以在此处找到我为测试您的代码而创建的项目。

于 2014-04-05T23:27:52.453 回答