我正在学习iOS开发。现在正在玩意见。我目前不使用界面构建器,因为我更喜欢了解所有东西是如何工作的。这就是我以编程方式创建视图UI元素等的原因。然而。 这是我的项目的样子。
我有一个名为RootViewController的类。我使用该类作为窗口rootViewController。 在该类中,我有一个加载/卸载视图的逻辑。这是一些代码。
RootViewController.m
-(void)loadView
{
UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
self.view = view;
self.view.backgroundColor = [UIColor lightGrayColor];
// create FirstViewController button
UIButton *firstViewButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
firstViewButton.frame = CGRectMake(20, 60, 280, 50);
firstViewButton.tag = 1;
[firstViewButton setTitle:@"Load First view" forState:UIControlStateNormal];
[firstViewButton addTarget:self
action:@selector(loadViewControlllers:)
forControlEvents:UIControlEventTouchUpInside];
// crate SecondViewController button
UIButton *secondViewButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
secondViewButton.frame = CGRectMake(20, 140, 280, 50);
secondViewButton.tag = 2;
[secondViewButton setTitle:@"Load Second view" forState:UIControlStateNormal];
[secondViewButton addTarget:self
action:@selector(loadViewControlllers:)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:firstViewButton];
[self.view addSubview:secondViewButton];
[self.view release];
}
-(void)loadViewControlllers:(UIButton *)sender
{
if ([sender tag] == 1) {
if(firstViewController == nil) {
firstViewController = [[FirstViewController alloc]
initWithNibName:@"FirstViewController"
bundle:nil];
[self.view addSubview:firstViewController.view];
}
} else {
if(secondViewController == nil) {
secondViewController = [[SecondViewController alloc]
initWithNibName:@"SecondViewController"
bundle:nil];
[self.view addSubview:secondViewController.view];
}
}
}
第一个和第二个视图控制器包含相同的代码
-(void)loadView
{
UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
self.view = view;
self.view.backgroundColor = [UIColor redColor];
UIButton *remove = [UIButton buttonWithType:UIButtonTypeRoundedRect];
remove.frame = CGRectMake(20, 60, 280, 50);
[remove setTitle:@"Remove First view from superview" forState:UIControlStateNormal];
[remove addTarget:self
action:@selector(removeFromView:)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:remove];
[self.view release];
}
-(IBAction)removeFromView:(id)sender
{
[self.view removeFromSuperview];
}
到目前为止,这么好。 这是我的问题开始的地方。
1)这是显示/删除视图的正确方法吗?一个控制器(在我的情况下是rootViewController)来统治它们吗?
2)你能建议我在第一,第二和根视图之间传递数据的方法吗?让我们说第一个ViewController被加载了。该控制器包含文本字段和按钮。我想要的是当用户在文本字段中键入内容并按下按钮时,该文本字段中的数据能够通过rootViewController和secondViewController读取
3)应用程序运行良好。没有崩溃等问题是,当第一个或第二个控制器都没有被调用时,一旦它们无法再次加载。 当我按下按钮时,没有任何事情发生。
最后但不要忘记,抱歉我的语言。
答案 0 :(得分:0)
1)这是显示/删除视图的正确方法吗?一个控制器 (在我的情况下是rootViewController)来统治它们吗?
没关系。但是,如果firstViewController和secondViewController共享完全相同的逻辑,那么它们实际上是一个类,并且通常可以安全地删除冗余。
2)你能否建议我在第一,第二和第二之间传递数据的方法 根视图?让我们说第一个ViewController被加载了。那个控制器 包含文本字段和按钮。我想要的是当用户输入时 文本字段中的某些内容和按钮按下了该数据 textfield能够通过rootViewController读取和 secondViewController
您可以使用单例实例来保存共享状态(MVC模式中的模型),但不建议这样做。 恕我直言,您可以使用具有键值观察模式的观察者模型。请参阅Apple的指南here。或者,您可以从一个控制器发布NSNotification,以通知对该类型通知感兴趣的任何其他控制器。请参阅[此处的指南]。2
3)应用程序运行良好。没有崩溃等问题是 当第一个或第二个控制器都不能被调用时 再次加载。当我按下按钮时,没有任何事情发生。
在上面的代码中,只有当控制器ivars为nil时才会添加子视图。尝试修复这个逻辑。