在我的应用程序中,我有一个向下钻取类型的界面,如下所示:
我的根视图,它有一个项目列表和一个“添加”按钮。
选择一个项目会推动导航控制器上的“详细信息”视图。
选择“添加”按钮会推送“添加”视图。
如何在 Add 视图和 Detail 视图之间转换?
我正在考虑在 Add 视图上做一个无动画的“pop”并推动 Detail 控制器,但是我如何使第二部分动画化,所以细节视图要么垂直滑入,要么从 Add 视图淡入?
谢谢,
凯尔索
在我的应用程序中,我有一个向下钻取类型的界面,如下所示:
我的根视图,它有一个项目列表和一个“添加”按钮。
选择一个项目会推动导航控制器上的“详细信息”视图。
选择“添加”按钮会推送“添加”视图。
如何在 Add 视图和 Detail 视图之间转换?
我正在考虑在 Add 视图上做一个无动画的“pop”并推动 Detail 控制器,但是我如何使第二部分动画化,所以细节视图要么垂直滑入,要么从 Add 视图淡入?
谢谢,
凯尔索
您可以将 Add View 推送到 Details 视图并设置一个变量来记住这一点。当用户尝试弹出 Add View 时,您检查先前的变量,如果设置,则直接弹出到根控制器(应该会自动弹出 Details 视图)。
马可
使添加视图成为模式,并在其中提供“完成”(或“保存”)和“取消”按钮。如果用户点击取消,您只需关闭模式。如果他们点击完成,则将新记录保存到表模型中,然后在返回之前在根视图上重新加载表。为了更好,您可以闪烁新添加的项目。
一个干净的设置方法是让模态控制器实现一个期望“完成”协议方法的委托,并让根控制器实现它并将自己设置为委托。
这样,当用户点击“完成”时,根控制器会收到通知,因此它可以封装所有需要发生的事情。如果您想直接从添加到详细视图,委托方法可以为新添加的记录执行“推送”,您将获得从模式向下滑动到详细视图的良好过渡。
根据 Ramin 的回复,您可以尝试这种方式,Apple 在几个示例中使用了这种方式:
MyListViewController.h
#import "MyAddViewController.h"
@interface MyListViewController : UITableViewController <MyAddViewControllerDelegate> {
}
- (IBAction)add:(id)sender;
@end
MyListViewController.m
// Action for bring up add view controller
- (IBAction)add:(id)sender {
MyAddViewController *addViewController = [[MyAddViewController alloc] initWithStyle:UITableViewStyleGrouped];
addViewController.delegate = self;
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:addViewController];
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[addViewController release];
}
// MyAddViewController's delegate method, dismiss the add view controller in here
- (void)addViewController:(MyAddViewController *)addViewController didAddData:(MyData *)data{
if (data) {
MyDetailViewController *detailViewController = [[MyDetailViewController alloc] initWithStyle:UITableViewStylePlain];
detailViewController.data = data;
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
}
[self dismissModalViewControllerAnimated:YES];
}
MyAddViewController.h
@protocol MyAddViewControllerDelegate;
@class MyData;
@interface MCCourseAddTableViewController : UITableViewController {
@private
MyData *data;
id <MCCourseAddDelegate> delegate;
}
// MyData could be NSManagedObject if you want to use Core Data
@property(nonatomic, retain) MyData *data;
@property(nonatomic, assign) id <MyAddViewControllerDelegate> delegate;
- (void)save;
- (void)cancel;
@end
@protocol MyAddViewControllerDelegate <NSObject>
@optional
- (void)addViewController:(MyAddViewController *)addViewController didAddData:(MyData *)data;;
@end
MyAddViewController.m
- (void)save {
if (self.delegate != nil) {
if ([self.delegate conformsToProtocol:@protocol(MyAddViewControllerDelegate)]){
if ([self.delegate respondsToSelector:@selector(addViewController:didAddData:)]){
// Send data back to List View, to bring up detail view controller and dismiss add view controller
[self.delegate addViewController:self didAddData:self.data];
}
}
}
}
- (void)cancel {
if (self.delegate != nil) {
if ([self.delegate conformsToProtocol:@protocol(MyAddViewControllerDelegate)]){
if ([self.delegate respondsToSelector:@selector(addViewController:didAddData:)]){
// Send nil back to ListView, to dismiss the add view controller only
[self.delegate addViewController:self didAddData:nil];
}
}
}
}