从 UIView ios 推送视图控制器

Posted

技术标签:

【中文标题】从 UIView ios 推送视图控制器【英文标题】:push a view controller from a UIView ios 【发布时间】:2012-01-24 05:03:36 【问题描述】:

我有一个基于导航的应用程序。单击第一个屏幕导航栏上的按钮时,我可以按如下方式推送另一个视图控制器:

 -(void) buttonClicked:(id)sender


    UIViewController*  mv = [[SecondViewController alloc] init];

    [[self navigationController] pushViewController:mv animated:YES];  


现在我有一个 UIView(单独的 .h 和 .m 文件)作为第一个屏幕的一部分。单击 UIView 中的按钮时,我想推动 SecondViewController。 我尝试了以下方法:

 UIViewController*  mv = [[SecondViewController alloc] init];
 UIViewController * home=[[FirstViewController alloc]init];
 [[home navigationController] pushViewController:mv animated:YES];

没有用!!请帮忙

【问题讨论】:

试试 [self.navigationController popToRootViewController animated:YES]; UIView 没有“navigationController”属性。 房间里的大象是:这个 UIView 到底是什么东西?如果没有容器,你不能将 UIView 推送到堆栈中......而且将他的第一个视图包含在 UIViewController 或 UINavigationController 中并在启动时将其覆盖在主窗口上要比仅在其上放置 UIView 要容易得多... 【参考方案1】:
UIViewController*  mv = [[SecondViewController alloc] init];
UIViewController * home=[[FirstViewController alloc]init];
[[home navigationController] pushViewController:mv animated:YES];

这里的问题是home 不是导航堆栈的一部分,所以[home navigationController] 肯定是零。我不太清楚你在这里要做什么,但仅仅创建一个视图控制器并不意味着它实际上是视图控制器图的一部分。

【讨论】:

home 是导航堆栈的一部分...因为直接在 home.view 上单击按钮,我可以导航到第二个视图。问题是当我单击 UIView 上的按钮时,我无法导航 @user930514 不在您提供的代码中,我在上面引用过。在第 2 行,您分配并初始化一个 FirstViewController 并将其分配给 home。该控制器显然不是任何导航堆栈的一部分,因此调用navigationController 将产生零。尝试在第二行之后添加UINavigationController *nav = [home navigationController];,并在调试器中检查 nav 的值来验证这一点。【参考方案2】:

为什么会起作用?随机创建视图甚至不可见的视图控制器不是解决方案。您可以像这样在视图中保留对 VC 的引用:

@imlementation ViewController

- (id) init

    // ...
    aView = [[CustomView alloc] init];
    aView.viewController = self;
    // ...


@end

@interface CustomView

@property (assign) ViewController *viewController;

@end

或者你可以在运行时搜索响应者链:

UIResponder *next = [view nextResponder];
while (next)

    if ([next isKindOfClass:[ViewController class]])
    
        break;
    
    next = [next nextResponder];

现在“next”将包含视图控制器(如果找不到,则为 nil)。

【讨论】:

随机创建视图不可见的视图控制器是什么意思?所有视图都是可见的,我们只有 2 个视图控制器......第一个和第二个。 UIView 占据了第一屏的一部分 语句aView.viewController = self不能写。它给出了一个错误。甚至@property(assign) ViewController *viewController 给出了一个错误...说 Unknown ViewController..我尝试导入 ViewController.h 但它给出了其他错误 我的意思是,如果您创建一个与导航堆栈、响应程序链等无关的视图控制器,那么它将无法工作,因为父视图控制器对此一无所知。跨度> 天哪,你不明白这是一个示例吗?当然,您需要将自己的视图控制器类名替换为 ViewController... 视图控制器与导航堆栈有关...因为当我们直接点击 home.view 上的按钮时,它会导航!【参考方案3】:

尝试使用相同的navigationController来推送视图,这样可以保持相同的ViewControllers堆栈。

UIViewController*  mv = [[SecondViewController alloc] init];
[[self navigationController] pushViewController:mv animated:YES]; 

[mv release];

【讨论】:

UIView 没有 navigationController 属性。 等等,他为什么要推 UIView? secondViewController 是 UIViewController,不是吗?【参考方案4】:

我现在看到你的问题了!你需要#import你的FirstViewController,然后@class它。然后做你的推送。

所以:

//.h 
#import "FirstViewContoller.h"

@class FirstViewController;

@interface...

//.m

-(void)return 
FirstViewController *firstview = [[FirstViewController alloc]init(withnibname:)];
[firstView.navigationController pushViewController: firstView.navigationController.topViewController animated: TRUE];

【讨论】:

UIView 没有 navigationController 属性!【参考方案5】:

如果我没记错的话,您的 UIView 虽然位于单独的文件中,但仍会从 UIViewController 类添加到屏幕。

只需从 UIView 向您的 FirstViewController 类发布通知,您可以在其中访问导航控制器。然后从那里推送 SecondViewController。

【讨论】:

【参考方案6】:

你可以用这个。它对我来说效果很好:-

首先在 UIView 类中创建 AppDelegate 的对象并对其进行初始化。然后在 Appdelegate.h 中创建 Navigationcontroller 对象:-

@property(strong,nonatomic) UINavigationController *navControl;

在你的 UIView 类中实现你想要推送的代码:-

ViewController *objview = [[ViewController alloc]init]; [appDelegate.navControl pushViewController:objview animated:YES];

【讨论】:

以上是关于从 UIView ios 推送视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中向 UIView 添加第二个 UITabBar(控制器?)

从 iOS 中呈现的视图控制器推送视图

如何从 NSObject 类获取导航控制器并在 ios 中推送视图控制器

iOS 如何从 Uiview 呈现 Modal ViewController

推送视图控制器时延迟(iOS)

在 iOS 拆分视图控制器上推送新的视图控制器