2015-04-20 125 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,並且您的所有新問題都會以您喜歡的方式顯示。