如何通过同一个 ViewController(在故事板上创建)在两个视图(在 xib 上创建)之间切换?

Posted

技术标签:

【中文标题】如何通过同一个 ViewController(在故事板上创建)在两个视图(在 xib 上创建)之间切换?【英文标题】:How can I switch between two view (created on xib) over the same ViewController (created on storyboard)? 【发布时间】:2013-04-11 20:18:26 【问题描述】:

我正在尝试做一些不同的事情,将 XIB 和 STORYBOARD 混合在一起。我的主要目标是为我的应用程序创建一个复杂的故事板,并使用 XIB 来查看比 iPhone 屏幕更大的视图,例如 iPhone 上的设置应用程序。

作为一个简单的例子,我使用 xib 接口创建了两个类视图 view1 和 view2。每个人都做简单的任务,比如显示许多标签“Hello World - View 1”和“Hello World - View 2”,直到覆盖正常 iPhone 屏幕面积的两倍。为此,XIB 上的视图被设置为“FreeForm”,并沿视图放置了 6 个标签。 .h 和 .m 文件写成:

查看.h

#import <UIKit/UIKit.h>

@interface View1 : UIView 
    UIView *view;

    UILabel *lab1;
    UILabel *lab2;
    UILabel *lab3;
    UILabel *lab4;
    UILabel *lab5;
    UILabel *lab6;

@property (nonatomic, retain) IBOutlet UIView *view;
@property (retain, nonatomic) IBOutlet UILabel *lab1;
@property (retain, nonatomic) IBOutlet UILabel *lab2;
@property (retain, nonatomic) IBOutlet UILabel *lab3;
@property (retain, nonatomic) IBOutlet UILabel *lab4;
@property (retain, nonatomic) IBOutlet UILabel *lab5;
@property (retain, nonatomic) IBOutlet UILabel *lab6;
@end

查看.m

#import "View1.h"

@implementation View1
@synthesize view, lab1, lab2, lab3, lab4, lab5, lab6;

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
        [[NSBundle mainBundle] loadNibNamed:@"View1" owner:self options:nil];
        [self addSubview:self.view];
    
    return self;

- (void) awakeFromNib

    [super awakeFromNib];    
    [self addSubview:self.view];

@end

之后,我使用 Storyboard 创建了一个名为 myViewController 的 ViewController,并在视图中放置了一个滚动视图。 .h和.m的代码如下:

ViewController.h

#import <UIKit/UIKit.h>
@class View1, View2;

@interface ViewController : UIViewController 
    View1 *viewXIB1;
    View2 *viewXIB2;

@property (weak, nonatomic) IBOutlet UIScrollView *myScrollView;
- (IBAction)changeView1:(id)sender;
- (IBAction)changeView2:(id)sender;
@end

ViewController.m

#import "ViewController.h"
#import "View1.h"
#import "View2.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad

    [super viewDidLoad];

    self.myScrollView.contentSize=CGSizeMake(320,755);    
    viewXIB1 = [[View1 alloc] initWithFrame:CGRectMake(0, 0, 320, 755)];
    viewXIB2 = [[View2 alloc] initWithFrame:CGRectMake(0, 0, 320, 755)];
    [self.myScrollView addSubview:viewXIB1];  


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];


- (IBAction)changeView1:(id)sender 
    [self.myScrollView addSubview:viewXIB1];
    [self.myScrollView setNeedsLayout];    
    [self.view reloadInputViews];
    [self reloadInputViews];   


- (IBAction)changeView2:(id)sender 
    [self.myScrollView addSubview:viewXIB2];
    [self.myScrollView setNeedsLayout];

@end

问题是代码上没有警告或错误,但不起作用。 这段代码有什么问题???有人可以帮我吗?

【问题讨论】:

【参考方案1】:

有一件事是错误的,您永远不会删除任何视图。替换

第一个IBAction

- (IBAction)changeView1:(id)sender 
    if (![self.myScrollView.subviews containsObject:viewXIB1]) 
        [viewXIB2 removeFromSuperView];
        [self.myScrollView addSubview:viewXIB1];
        [self.myScrollView setNeedsLayout];    
        [self.view reloadInputViews];
        [self reloadInputViews];
    

第二个是模拟的IBAction

- (IBAction)changeView2:(id)sender 
    if (![self.myScrollView.subviews containsObject:viewXIB2]) 
        [viewXIB1 removeFromSuperView];
        [self.myScrollView addSubview:viewXIB2];
        [self.myScrollView setNeedsLayout];
    

此外,自定义视图的初始化代码应该包含类似的内容。-

UIView *newView = [[[NSBundle mainBundle] loadNibNamed:@"View1" owner:self options:nil] objectAtIndex:0];
[self.view addSubview:newView];

【讨论】:

观察良好@ssantos,但应用程序仍然无法正常工作。按钮也接收触摸和滚动视图,但滚动视图内没有任何内容。奇怪的是,在标签 View1 和 View2 (lab1, lab2 ... lab6) 上创建的即时变量看起来不像在 XIB 上加载内容,因为当我尝试使用命令行查看其内容时:“( lldb) po lab1"返回为 "$0 = 0x00000000 "。可能还是有问题。 很难说发生了什么,但进一步研究你的代码,这行没有意义[self.view addSubview:self.view];。我会编辑我的答案 伟大的@ssantos。这是我发现的两个问题之一,正确的代码是 [self addSubview:self.view]。第二个问题是我忘记为我的文件所有者设置自定义类的“类”。现在我的应用程序工作正常!非常感谢,解决我的问题。

以上是关于如何通过同一个 ViewController(在故事板上创建)在两个视图(在 xib 上创建)之间切换?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过按钮按下关闭和重新打开 viewController?

如何通过来自同一个 TableViewController 的多个 segue 到同一个 ViewController

如何通过 AlertView 切换到另一个 ViewController 并执行 segue?

如何通过推送从 xib 转换到 ViewController

如何通过 segue 到下一个 ViewController 使“查看全部”按钮显示数据?

如何通过 PageViewController 将 viewController 的数据传递给 pageViewController 的第二个 ViewController