2015-04-20 126 views
0

我只需要找出有关iOS视图和布局的几件事情。我刚刚结束了应用程序,我必须创建一个显示测试的控制器。除了一件事情,这很容易。有两种类型的问题A和B.一个问题有4个答案变种,B个问题没有。所以我不得不根据问题类型生成代码中的所有布局。我已经通过创建方法update完成了我在那里重建我的视图。动态视图控制器

- (void)update { 
    for (UIView *v in self.view.subviews) { 
     [v removeFromSuperview]; 
    } 
    //label initialization with frame calculation 
    UILabel *questionLabel = [[UILabel alloc]initWithFrame:CGRectMake(PADDING,  PADDING, size.width - 4 * PADDING, 0)]; 
    [questionLabel sizeToFit]; 
    [self.view addSubview:questionContainerView]; 

    //If type A 
    if ([self.question.questionType isEqualToString:@"A"]) { 
     for (Answer *a in self.question.answers) { 
      UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(PADDING, offset, size.width - 2 * PADDING, 30 + PADDING)]; 
      //customization 
      [self.view addSubview:button]; 
      offset += button.frame.size.height + MARGIN_BOTTOM; 
     } 
     //if B type 
    } else { 
     UITextField *answerField = [[UITextField alloc] initWithFrame:CGRectMake(PADDING, PADDING, view.frame.size.width - 2*PADDING, view.frame.size.height - 2 * PADDING)]; 
     [view addSubview:answerField]; 
     offset += view.frame.size.height + MARGIN_BOTTOM; 
    } 
    UIView *lastView = [[self.view subviews]lastObject]; 
    self.scrollView.contentSize = CGSizeMake(size.width, lastView.frame.origin.y + lastView.frame.size.height + 10); 
} 

而毕竟我认为它不可能如此复杂。请帮助找出我该如何正确地做,因为我确信我的方法不是最佳的。也许创建自定义布局。我的意思是如何避免设置框架,并简单地添加正确位置的视图。

回答

0

这是非常模糊的,我假设你反对使用任何GUI工具?无论如何,不​​是每次更新后创建每个视图,为什么不创建两个视图,然后根据问题隐藏或显示它们?

你可以简单地使用bringSubviewToFrontsendSubviewToBack或简单地设置隐藏。通过这种方式,您可以创建视图并简单地显示或隐藏它们,而不会破坏它们并重新创建所有内容,尽管这样简单的事情可以轻松完成。

我的建议是?使用故事板或Xib创建这些子视图,然后隐藏或显示您选择的视图。这样,您可以轻松地布置视图,无需触摸任何代码即可。

现在,如果问题都是不断变化的,那么这就是您想使用UITableViewController的原因,因为这是它的设计目的。您可以为不同的问题场景创建一些定制的UITableViewCells,然后根据问题的类型重用它们。然后,您只需更新tableView的dataSource,并且您的所有新问题都会以您喜欢的方式显示。