【问题标题】:Transitioning between subviews in a navigationController?在导航控制器中的子视图之间转换?
【发布时间】:2009-03-06 07:25:49
【问题描述】:

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

如何在“添加”视图和“详细信息”视图之间转换?

我正在考虑在 Add 视图上做一个无动画的“弹出”并推动 Detail 控制器,但是我如何使第二部分动画化,以便详细视图可以垂直滑入或从 Add 淡入查看?

谢谢,
凯尔索

【问题讨论】:

    标签: iphone navigation transition hierarchy


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以将添加视图推送到详细信息视图并设置一个变量来记住这一点。 当用户尝试弹出 Add View 时,您检查先前的变量,如果设置,则直接弹出到根控制器(应该会自动弹出 Details 视图)。

      马可

      【讨论】:

        【解决方案3】:

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

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

        这样,当用户点击“完成”时,根控制器会收到通知,因此它可以封装所有需要发生的事情。如果您想直接从添加到详细视图,委托方法可以为新添加的记录执行“推送”,您将获得从模式向下滑动到详细视图的良好过渡。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-09-06
          • 2023-03-06
          • 1970-01-01
          • 2014-10-10
          • 1970-01-01
          • 1970-01-01
          • 2011-04-25
          相关资源
          最近更新 更多