如何通过同一个 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