Iphone 处理观点和其他一些事情

Iphone 处理观点和其他一些事情,iphone,objective-c,Iphone,Objective C,我正在学习iOS开发。现在玩视图。我现在不使用interface builder,因为我更喜欢了解所有东西在引擎盖下是如何工作的。这就是我以编程方式创建视图、UI元素等的原因。然而 下面是我的项目的样子 我有一个名为RootViewController的类。我将该类用作窗口rootViewController。 在该类中,我有一个加载/卸载视图的逻辑。下面是一些代码 RootViewController.m -(void)loadView { UIView *view = [[UIVie

我正在学习iOS开发。现在玩视图。我现在不使用interface builder,因为我更喜欢了解所有东西在引擎盖下是如何工作的。这就是我以编程方式创建视图、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您能给我建议一种在第一视图、第二视图和根视图之间传递数据的方法吗?假设加载了firstViewController。该控制器包含文本字段和按钮。我想要的是,当用户在文本字段中键入某个内容并按下按钮时,该文本字段中的数据能够被rootViewController和secondViewController读取

3.应用程序运行良好。没有崩溃等。问题是,当第一个或第二个控制器都没有被调用时,它们就不能再次加载。 当我按下按钮时,什么也没发生

最后但并非最不重要的是,我对我的语言感到抱歉

1这是否是显示/删除视图的正确方法。一个控制器 在我的情况下,rootViewController可以对它们进行规则化吗

没关系。但是,如果firstViewController和secondViewController共享完全相同的逻辑,那么它们实际上是一个类,通常删除冗余是安全的

你能给我建议一种在第一、第二和第三方之间传递数据的方法吗 根视图?假设加载了firstViewController。那个控制器 包含文本字段和按钮。我想要的是当用户输入 文本字段中的某个内容和按钮被按下,其中的数据 文本字段可由rootViewController和 第二视图控制器

您可以使用单例实例来保存共享状态,即MVC模式中的模型,但不建议这样做。 IMHO,您可以使用具有键值观察模式的观察者模型。参见苹果指南。或者,您可以从一个控制器发布通知,以通知对该类型通知感兴趣的任何其他控制器。请参阅[此处的指南]

3.应用程序运行良好。没有碰撞等。问题是 当第一个或第二个控制器都不能被调用时 重新加载。当我按下按钮时,什么也没发生

在上面的代码中,仅当控制器IVAR为nil时才添加子视图。试着修正这个逻辑