在navigationController中的子视图之间转换?

时间:2009-03-06 07:25:50

标签: iphone navigation transition hierarchy

在我的应用程序中,我有一个下钻类型界面,如下所示:
我的根视图,其中包含一个项目列表和一个“添加”按钮 选择项目会推送navigationController上的“Detail”视图 选择“添加”按钮将按下“添加”视图。

如何在添加视图到详细信息视图之间进行转换?

我正在考虑在Add视图上执行一个非动画“pop”并按下Detail控件,但是如何使第二部分设置为动画,因此详细视图可以垂直滑动或从Add中淡入查看?

谢谢,
凯尔索

3 个答案:

答案 0 :(得分:0)

您可以将“添加视图”推送到“详细信息”视图并设置变量以记住该变量。 当用户尝试弹出“添加视图”时,检查上一个变量,如果设置,则直接弹出到根控制器(应该自动弹出“详细信息”视图)。

答案 1 :(得分:0)

使添加视图成为模态,并在其中提供“完成”(或“保存”)和“取消”按钮。如果用户点击取消,您只需关闭模态。如果它们命中Done,则将新记录保存到表模型,然后在返回之前在根视图上执行表重新加载。为了好,你可以闪现新添加的项目。

设置它的一种简洁方法是使模态控制器实现一个委托,它需要一个'完成'协议方法,并让根控制器实现它并将自己设置为委托。

这样,当用户点击“完成”时,将通知根控制器,以便它可以封装所有需要发生的事情。如果你想直接从添加到详细信息视图,委托方法可以为新添加的记录执行“推送”,并且您将从模态向下滑动到详细视图。

答案 2 :(得分:0)

根据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];
            }
        }
    }
}