在 iOS 7 中动态更改 UIViewController 的视图
Posted
技术标签:
【中文标题】在 iOS 7 中动态更改 UIViewController 的视图【英文标题】:Change the view of a UIViewController dynamically in iOS 7 【发布时间】:2014-01-14 04:12:41 【问题描述】:我有 2 个自定义视图类 (CustomView_A, CustomView_B
) 派生自 UIView
。我有 UIViewController
应该能够在运行时在视图之间切换..
到目前为止,我所做的是.. 在 Storyboard 中,我使用 CustomView_A
类作为 View 类。
@interface MyViewController: UIViewController
@property (nonatomic, weak) CustomView_A *customView_A;
现在我有了第二个CustomView_B
类,我想在运行时将MyViewController
的视图更改为CustomView_B
。
我该怎么做?提前谢谢..
【问题讨论】:
你可以简单地隐藏 CustomView_A 并使用 UIViewAnimation 显示 CustomView_B! 您的 CustomView_A/B 在 Nib/storyboard/Code 中?它很容易设置你self.view = CustomView_B instance
。
【参考方案1】:
好的,这是你想要的代码 -
在你的MyViewController.h
放 -
@property (nonatomic, retain) CustomView_A *customView_A;
@property (nonatomic, retain) CustomView_B *customView_B;
-(void)switchView; // to switch the views.
在你的MyViewController.m
放 -
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.customView_A = [[CustomView_A alloc]initWithFrame:self.view.frame];
self.customView_A.backgroundColor = [UIColor redColor];
UIButton *trigger = [UIButton buttonWithType:UIButtonTypeRoundedRect]; // Just take this button so that your switchView methods will get called on click of this method.
[trigger setFrame:CGRectMake(10, 10, 50, 30)];
[trigger setTitle:@"Click" forState:UIControlStateNormal];
[trigger addTarget:self action:@selector(switchView) forControlEvents:UIControlEventTouchUpInside];
[self.customView_A addSubview:trigger];
[self.view addSubview:self.customView_A];
self.customView_B = [[CustomView_B alloc]initWithFrame:self.view.frame];
self.customView_B.backgroundColor = [UIColor yellowColor];
self.customView_B.hidden = YES;
[self.view addSubview:self.customView_B];
- (void)switchView
[UIView animateWithDuration:10 delay:10 options:UIViewAnimationOptionCurveEaseInOut animations:^
self.customView_A.hidden = YES;
self.customView_B.hidden = NO;
completion:nil];
当你再次想切换视图时,做相反的事情。
【讨论】:
【参考方案2】:不要。您所描述的是对 UIViewController 的根本误解。一旦一个 UIViewController 实例有一个view
,那就永远是它的view
。
如果您想要两个不同的视图,那么:
使用两个视图控制器(例如,您可以在视图控制器 A 及其视图之上呈现视图控制器 B 及其视图,使用模态 segue),或
使这些视图中的至少一个不属于视图控制器:只需将该视图放在另一个视图的前面,然后再将其删除,随意。
【讨论】:
【参考方案3】:试试这个:
- (IBAction)changeView
if (self.customView_A.hidden == YES)
self.customView_A.hidden = NO;
self.customView_B.hidden = YES;
//You should use a UIView animation here to do this.
else
self.customView_A.hidden = YES;
self.customView_B.hidden = NO;
//Same here
)
在您的viewDidLoad
中将视图添加到CGRectZero
- (void)viewDidLoad
self.customView_A = [[CustomView_A alloc]initWithFrame:CGRectZero];
[self.view addSubview:self.customView_A];
//do the same with the other custom view
对不起,如果代码有点错误,我没有使用Xcode
来输入。
【讨论】:
以上是关于在 iOS 7 中动态更改 UIViewController 的视图的主要内容,如果未能解决你的问题,请参考以下文章
如何使用导航栏在模态视图中更改iOS 7中的UIStatusBarStyle?
从 didSelectRowAtIndexPath iOS 10 在 UIViewController 中添加新的 subView