簡體   English   中英

Interface Builder中的多個視圖狀態

[英]Multiple view states in Interface Builder

我正在制作一個有3種狀態的屏幕:

  • 證實
  • 載入中
  • 錯誤

前兩個很容易,因為只有標簽文本更改。 第三個是棘手的,因為我需要顯示一條錯誤消息並在其上有一個重試按鈕。

另外,我想把所有這些都放在一個控制器下(我猜這很簡單。)

問題是:如何在Interface Builder中執行多個視圖狀態? 有沒有人這樣做過? 或者我是以錯誤的方式解決這個問題?

您可以嘗試添加根據需要添加或刪除的其他視圖。 在“文件所有者”,“第一響應者”,“查看”等窗口中,從庫中添加三個UIView。 您可能希望將其名稱從“查看”更改為“驗證”,“加載”和“錯誤”。

現在打開每個並通過添加按鈕和標簽以及其他類似的東西來自定義它。

回到XCode,聲明新視圖:

IBOutlet UIView *validView;
IBOutlet UIView *loadView;
IBOutlet UIView *errorView;

並確保在InterfaceBuilder中進行適當的連接。 您希望從這些視圖中鏈接的任何操作都應該很有效。

現在,切換,創建一個動作(或三個不同的動作)。 這可以是IBAction或不是你喜歡的。 在標題中:

-(void)showError;

現在為了實現,你可能想要這樣的東西。

-(void)showError {
  // skip this if you always arrive from the validView
  if ([validView superview]) {
    [validView removeFromSuperview];
  } 
  [self.view addSubview:errorView];
}

如果您願意,可以通過動畫獲得更好的體驗:

    -(void)toggleErrorWithFlip {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.8];
    [UIView setAnimationTransition:([errorView superview] ? UIViewAnimationTransitionFlipFromLeft : UIViewAnimationTransitionFlipFromRight) 
                           forView:[self view]
                             cache:YES];
    if ([errorView superview]) {
        [errorView removeFromSuperview];
    } else {
        [[self view] addSubview:errorView];
    }
    [UIView commitAnimations];
}

“重試”按鈕可能會觸發以下行的操作:

-(IBAction)retryLoad {
  [errorView removeFromSuperview];
  [self.view addSubview:validView];
  // do some stuff that retries whatever was tried and failed
}

同樣,這可以在有或沒有動畫的情況下發生。

如果有一個默認視圖,一個你總是重新開始的視圖(例如validatingView),那么將其作為原始的“View”,然后在其上添加另外兩個視圖(例如loadView和errorView)。 這可能會節省一些工作,具體取決於你想要的東西。

你的錯誤似乎是UIAlertView的一個很好的候選者

//wherever error is detected
UIAlertView *alert = [[UIAlert View alloc] initWithTitle:@"Error" message:@"An error occured" delegate:self cancelButtonTitle:@"Forget It" otherButtonTitles:@"Retry", nil];
[alert show];
[alert release];

//implement the delgate method
- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated         {
  switch(buttonIndex) {
    case 0:
    break;
    case 1:
    break;
    default
    break;
  }
}

您還必須在標題中實現UIAlertViewDelegate!

你究竟做了什么取決於所涉及的布局。 我多次使用的最簡單的方法是布置所有控件,並將它們的組標記為隱藏/不隱藏在以下方法中:

- (void) showErrorModeControls
{
    self.errorLabel.hidden = NO;
    self.errorButton.hidden = NO;
    self.regularLabel.hidden = YES;
    self.regularButton.hidden = YES;
}

你也可以做動畫,淡入/淡出等等。這是一種方式。

另一種方法是將控件分組到主視圖的子視圖中,並將這些子視圖顯示/隱藏為整體。 只有在您可以設置排列所有視圖以便當多個可見時您可以看到其他視圖的內容時,這才有效。 您可以使用clearColor背景來實現這一目標。 這種方法的優點是你可以在界面構建器中單獨布置各個子視圖中的控件(你用一個巧妙的技巧來做到這一點:只需將其他視圖的幀的X坐標設置為320(或任何適合的視圖)你想要編輯的視圖“讓它們脫離”。然后你完成后將它們移回X coord 0。

我使用的另一種方法是將整個“頁面”視圖像迷你導航視圖控制器一樣,並通過動畫“屏幕上”和“屏幕外”框架來自行滑入和滑出這些視圖。 您可以在上面的界面構建器中使用相同的技巧來一次處理這些“頁面”子視圖。

如果您需要自定義警報,您實際上可以使用TSAlertView類。 它運行得非常好,並且易於部署。 它看起來像一個UIAlertView,但你可以用UITextView,帶有圖例的多個按鈕等來實際定制它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM