我正在处理具有 3 种状态的屏幕:
- 正在验证
- 正在加载
- 错误
前两个非常简单,因为只更改了标签文本。第三个比较棘手,因为我需要显示一条错误消息并在其上有一个重试按钮。
此外,我希望将所有这些都放在一个 Controller 下(我想这是最简单的部分。)
问题是:如何在 Interface Builder 中执行多个 View 状态?以前有人这样做过吗?还是我以错误的方式处理这个问题?
最佳答案
您可以尝试添加根据需要添加或删除的其他 View 。在带有“文件所有者”、“第一响应者”、“ View ”等的窗口中,从库中添加三个 UIView。您可能需要将它们的名称从“View”更改为“Validating”、“Loading”和“Error”。
现在打开每一个,并通过添加按钮、标签和其他类似的东西来自定义它。
返回 XCode,声明新 View :
IBOutlet UIView *validView;
IBOutlet UIView *loadView;
IBOutlet UIView *errorView;
并确保在 InterfaceBuilder 中进行适当的连接。您希望从任何这些 View 链接的任何操作都应该效果很好。
现在,要进行切换,请创建一个操作(或三个不同的操作)。这可以是 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
}
同样,无论有没有动画,这种情况都可能发生。
如果有一个默认 View ,您总是依赖该 View (例如 validatingView),则将其设为原始“ View ”,然后在其顶部添加其他两个 View (例如 loadView 和 errorView)。这可能会节省一些工作,具体取决于您希望事情如何进行。
关于iphone - Interface Builder 中的多个 View 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5117721/