使用UIButton在不同的viewControllers之间跳转?

时间:2012-08-07 18:45:26

标签: objective-c xcode

我点击了一个按钮,打开另一个 viewController (familyView) 。 在familyView中还有另一个按钮,它会让我回到 mainViewController(ViewController.xib) ,但我不知道如何调用主viewController。

我的方法是致电familyView

UIViewController* familyView = [[UIViewController alloc] initWithNibName:@"familyView" bundle:[NSBundle mainBundle]];
[self.view addSubview:familyView.view];

我希望你能帮忙打电话给主ViewController?我必须使用相同的方法来调用它吗?像这样我的意思是:

UIViewController* mainView = [[UIViewController alloc] initWithNibName:@"viewController" bundle:[NSBundle mainBundle]];
[self.view addSubview:mainView.view];

如果是,是否有更好的方法来实现这一点?在我的演示项目中,我正在尝试使用数据和一个按钮来回显示7个视图。

编辑: 如果我使用UIView那对我来说最好,而不是使用不同的viewControllers与他们的实现和接口文件? 我的项目将有视图,每个视图都有从不同的html页面解析的数据。

1 个答案:

答案 0 :(得分:1)

有两种方法可以使用。

  1. 的UINavigationController
  2. 代表
  3. 从你的问题看来,UINavigationController似乎是最好的选择,但我会告诉你们两者。


    <强>的UINavigationController

    当您从应用程序委托加载mainViewController时,需要将其包装在导航控制器中,如下所示:

    AppDelegate.h

    @property (strong, nonatomic) UINavigationController *navController;
    

    AppDelegate.m

    @synthesize navController = _navController;
    

    //在didFinishLaunchingWithOptions中:

    UIViewController *mainViewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
    
    navController = [[UINavigationController alloc] initWithRootViewController:mainViewController];
    
    self.window.rootViewController = nav1;
    [self.window makeKeyAndVisible];
    

    现在,在你的MainViewController中,你有了UINavigationController的说服力。

    如果您想从父母那里推送孩子,您可以这样做:

    ChildViewController *child = [[ChildViewController alloc]...];
    [self.navigationController pushViewController:child animated:YES];
    

    如果您在ChildViewController中并希望返回,只需执行:

    [self.navigationController popViewControllerAnimated:YES];
    

    这是“向下钻取”技术。

    (我知道“向下钻取”具有更多意义,但它提供了一个很好的参考框架。)


    <强>代表

    现在,您拥有的另一种方法是在类之间设置委托。因此,如果你在childView中并且需要打电话给你的父母,你将有一个渠道这样做。

    在MainViewController.h中设置如下:

    #import <UIKit/UIKit.h>
    
    //This is our delegate
    @protocol TalkToParentDelegate <NSObject>
    
    //This is our delegate method
    - (void)helloParent;
    @end
    
    @interface MainViewController : UIViewController <TalkToParentDelegate> 
    ...
    ..
    @end
    

    在MainViewController.m中,确保添加委托方法。

    - (void)helloParent {
      NSLog(@"Hello child, let me do something here");
    }
    

    在你的ChildViewController.h设置中它是这样的:

    #import <UIKit/UIKit.h>
    
    //Add header of class where protocol was defined
    #import "MainViewController.h"
    
    @interface ChildViewController : UIViewController
    
    //Create a property we can set to reference back to our parent
    @property (strong, nonatomic) id <TalkToParentDelegate> delegate;
    
    @end
    

    现在,在MainViewController.m中,无论何时出现ChildViewController,都要这样做:

    ChildViewController *child = [[ChildViewController alloc]...];
    
    //Set the delegate reference to parent 
    child.delegate = self;
    
    //present the view
    

    最后但并非最不重要的是,当您在您的孩子中时,您可以在父母(MainViewController)上调用方法,如下所示:

    [self.delegate helloParent];


    所以这里有两种方法可以使用。

    但是我想注意一下,你可以一起使用它们。假设你有一个UINavigationController,但仍然需要一个孩子与其父母交谈,你可以设置一个代表,这是可能的。

    • 希望这会有所帮助。