以编程方式切换自定义视图(推送和弹出)

Posted

技术标签:

【中文标题】以编程方式切换自定义视图(推送和弹出)【英文标题】:Switching custom views programmatically (pushing and popping) 【发布时间】:2011-08-09 18:16:07 【问题描述】:

ios 中,我的视图单独工作,但我无法在它们之间切换。

现在经过大量谷歌搜索后,我喜欢基于导航的应用程序可以很好地与视图堆栈配合使用。问题是我所有的观点都是在源代码中定制的 nib/xib-less 和定制的。因此,我需要自己的 UINavigationController 并手动/代码推送和弹出视图。因为每个教程要么是 nib/xib 和 IB 绑定的,要么只是一堆代码 sn-ps,我需要一个具体的例子来做。

一个简单的示例,其中包含 2 个以编程方式创建的视图(可以为空,只需使用 loadView 而不是使用 nib/xib 进行初始化)和一个工作堆栈(推送和弹出视图,例如:加载应用程序,创建一些根如果需要查看,推送一个视图,然后从该视图推送第二个视图,然后弹出它们)会很棒,或者至少是一个包含整个项目源代码而不是 sn-ps 的教程。

提前致谢。

编辑:经过一些额外的思考,再澄清一点也不错。我的应用程序基本上由 5 或 6 个视图组成,这些视图将被称为它们各自先前的视图,即向下钻取应用程序。

【问题讨论】:

我不明白。我也有几个视图,我需要以编程方式切换它们。所有教程都是用 .xib/.nib 文件完成的。因此,我刚刚完成了第五个小时的示例搜索。我已经阅读了文档,但这对我来说还不够。我发现并帮助我的最后一件事是 youtube Grrr 上的 video。 【参考方案1】:

这里有一个简短的代码,只有基本部分:

CodeViewsPushingAppDelegate.m

#import "CodeViewsPushingAppDelegate.h"
#import "ViewNumberOne.h"
@implementation CodeViewsPushingAppDelegate

@synthesize window = _window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions

    UINavigationController *navController = [[UINavigationController alloc] init];
    ViewNumberOne *view1 = [[ViewNumberOne alloc] init];
    [navController pushViewController:view1 animated:NO];
    [self.window addSubview:navController.view];
    [self.window makeKeyAndVisible];
    return YES;

ViewNumberOne.h

#import <UIKit/UIKit.h>

@interface ViewNumberOne : UIViewController

    UIButton *button;


- (void)pushAnotherView;

@end

ViewNumberOne.m

#import "ViewNumberOne.h"
#import "ViewNumberTwo.h"
@implementation ViewNumberOne

- (void)loadView

    [super loadView];
    button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(110, 190, 100, 20);
    [button setTitle:@"Push Me!" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(pushAnotherView) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];


- (void)pushAnotherView;

    ViewNumberTwo *view2 = [[ViewNumberTwo alloc] init];
    [self.navigationController pushViewController:view2 animated:YES];
    [view2 release];

ViewNumberTwo.h

#import <UIKit/UIKit.h>

@interface ViewNumberTwo : UIViewController

    UILabel *label;


@end

ViewNumberTwo.m

#import "ViewNumberTwo.h"

@implementation ViewNumberTwo

- (void)loadView

    [super loadView];
    label = [[UILabel alloc] init];
    label.text = @"I am a label! This is view #2";
    label.numberOfLines = 2;
    label.textAlignment = UITextAlignmentCenter;
    label.frame = CGRectMake(50, 50, 200, 200); //whatever
    [self.view addSubview:label];

【讨论】:

像魅力一样工作,希望其他人也能从中受益。 乐于帮助 :) 毕竟,除了初始化(您调用 init 并实现 loadView 而不是 initWithXib )之外,它完全相同。不过,我建议使用 xibs - 它消耗资源更少、速度更快、更容易更改和本地化。 感谢您的信息,但我的观点将是动态的,所以 xib 是毫无疑问的,无论如何,我知道这并不难,我正在搞乱基于导航的模板,但就是无法制作它可以工作,切换到基于空白窗口的窗口,然后总是缺少某些东西。谢谢;) @Niv ViewNumberOne 和 ViewNumberTwo 是如何获得navigationController 属性的?在方法- (void)pushAnotherView; 中有一行[self.navigationController pushViewController:view2 animated:YES];。您是否创建了指向导航控制器的指针,然后在初始化期间或以其他方式将指针传递给导航控制器?我最初认为这是代理的工作UINavigationControllerDelegate 但不,这个类别用于启用对当前加载视图的额外控制。

以上是关于以编程方式切换自定义视图(推送和弹出)的主要内容,如果未能解决你的问题,请参考以下文章

带有向下滑动动画的自定义推送视图控制器

如何在自定义单元格中点击以编程方式添加的 UiImageViews 推送新视图

以编程方式创建的 UINavigationController 推送和弹出问题

使用自定义初始化程序 swift 以编程方式实例化和推送视图控制器

使用导航控制器推送和弹出视图控制器:实现

如何将 UINavigationControllerDelegate 中的自定义过渡动画应用于特定的推送和弹出事件?