我在UITabBarController中有一个UINavigationController。 navigationcontroller有一个UITableView和一个用于编辑项目的表单。问题是如果在编辑过程中点击了一个选项卡,表单就会被清除,用户将被转储回UITableView。
有没有办法可以添加提示以确认远离编辑视图的导航?
答案 0 :(得分:1)
首先,在.h中声明一个BOOL来存储编辑状态。同时声明一个临时变量,稍后我们将用它来存储选定的行。
BOOL isEditing;
NSUInteger selectedRow;
在viewDidLoad中,将布尔值初始化为NO
- (void)viewDidLoad {
// initialization
isEditing = NO;
[super viewDidLoad];
}
然后,您可以将视图控制器符合UITextFieldDelegate
和UIAlertViewDelegate
。文本字段委托允许控制器在编辑结束时接收回调并从文本字段开始接收,并且警报视图委托允许它在取消警报视图时接收回调。
@interface MyController : UIViewController <UITextFieldDelegate, UIAlertViewDelegate>
然后,您还需要将所有文本字段的委托设置为分配给控制器。因此,在添加文本字段的cellForRowAtIndexPath
中,只需添加以下内容:
textField.delegate = self;
一旦你有了这个,你就被设置为从文本字段接收回调 - 所以现在实现以下两种方法:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
isEditing = YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
isEditing = NO;
}
现在关键是要创建一个单独的方法来推送下一个视图,所以就这样做(就像你选择表视图行时一样):
- (void)showNextView {
// in this method create the child view controller and push it
// like you would normally when a cell is selected
// to get the selected row, use the `selectedRow` variable
// we declared earlier.
}
现在,当用户选择一行时,您需要实现表视图回调 - 在此方法中,我们测试它们是否正在编辑并向它们显示提示。如果不是,我们转到下一个视图。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
selectedRow = [indexPath row];
if (isEditing) {
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Continue Editing?"
message:@"Continue Editing or discard edits"
delegate:self
cancelButtonTitle:@"Discard"
otherButtonTitles:@"Continue"];
[alert show];
[alert release];
return;
}
[self showNextView];
}
最后,我们需要在解除警报视图时实现警报视图委托回调:
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex != [alertView cancelButtonIndex]) return; // stay editing
[self showNextView];
}
希望一切都有意义,对你有所帮助!
答案 1 :(得分:0)
由于您使用的是UINavigationController,如果您将此“表单”推送到堆栈上,则可以设置
@property(nonatomic) BOOL hidesBottomBarWhenPushed
这样,标签栏将被隐藏,直到完成表格。
答案 2 :(得分:0)
我最终通过使用看起来像后箭头的自定义UIBarButtonItem解决了这个问题。