我创建了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];
}
}
唯一的另一个问题是,有时它会卡在一个视图上,无论我选择什么都不会加载它。
答案 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。