获取UIViewController以编程方式重新加载不同的UIView

时间:2012-06-14 15:22:08

标签: objective-c ios uiview uiviewcontroller

我在UIViewController中覆盖了loadView方法,如下所示:

-(void)loadView
{
    NSLog(@"HPSFormController loadView starting"); 

    HPSFormView* viewForThisController = [ [ HPSFormView alloc ] initWithFrame:_frame ] ;
    self.view = viewForThisController;

}

当在视图中按下某个按钮时,相同的UIViewController再次获得控制权,此时我希望完全改变控制器显示的视图。如下:

-(void)buttonTapped
{
    ABCFormView* newview = [ [ ABCFormView alloc ] initWithFrame:_frame ] ;
    self.view = newview;
}

但是,buttonTapped方法不会加载第二个视图。而是显示一个完全空白的视图。

如何在按下按钮时让视图控制器重新加载完全不同的视图?

4 个答案:

答案 0 :(得分:0)

  

但是,buttonTapped方法不会加载第二个视图。而是显示一个完全空白的视图。

问题是否与您创建ABCFormView的方式不一致?我的意思是,似乎原始视图被一个空视图替换,所以检查后者是如何创建的......

在您的评论后编辑:

如果你说视图是“在视图控制器中的viewDidLoad方法中创建的”,那么你应该实例化你的视图控制器:

@property (...) ABCFormViewController* newviewController;

....

-(void)buttonTapped
{
    self.newviewController = [ [ ABCFormViewController alloc ] init] ;
    self.view = newviewController.view;
}

请注意,只要您使用受控newviewControllerview必须存在,否则您将崩溃。这就是我将其引用存储在属性中的原因。

答案 1 :(得分:0)

显然,只需设置self.view = newView,就无法看到新视图。因为newView从未作为子视图添加到任何其他视图 - 即不在窗口中。

如果您需要切换到不同的视图,您应该将APSFormView作为子视图添加到viewcontroller.view,当您需要切换时,从superview中删除APSFormView,然后将ABCFormView作为新的子视图添加到viewcontroller.view。

答案 2 :(得分:0)

如果你的loadView实现不需要做太多其他事情,最好使用故事板来设置它。它很容易错过,但您可以在故事板中指定视图应该是自定义类型(在“身份检查器”中选择视图)。此外,可能值得评估为什么同一视图控制器实例需要完全不同的视图类;对我来说,这可能是关于应用程序设计的一面红旗。两个视图控制器之间的流可能会更好,或者在此自定义UIView扩展类中编写一些状态更改逻辑。对我的决定将基于视图所代表的模型以及每个旨在促进的行为。

如果模型不同(即您的第一个视图显示帐户列表,第二个显示一个帐户详细信息),或者行为明显不同(即第一个查看帐户,第二个创建新帐户) ,然后我会使用两个不同的视图控制器。

如果模型和行为相似,并且样式应该更改,那么我可能会在自定义视图类中编写状态更改代码以重新排列事物等。

如果你来自不同的平台,一开始看起来很傻,但我们真的会毫不犹豫地抛出视图控制器。它们由框架优雅地处理,旨在管理“屏幕内容”并轻松交换为另一个屏幕。

答案 3 :(得分:0)

很难说不知道ABCFormViewController里面是什么。我在视图控制器上有一些时间问题,我只需要生成视图,因为我想捕获其内容以创建一个pdf文件(它的视图永远不会在屏幕上显示)。在这种情况下,我需要插入这样的代码:

    [newviewcontroller.view setneedsrefresh]; 

在我做之前

     otherVC.view = newviewcontroller.view;

否则我会得到一个空白页面。   我相信我得到了这个,因为当所有东西都被整理出来时,ARC取消分配newviewcontroller,所以视图为零。在你的情况下,这可能不是问题。您是否有理由需要第二个和第三个视图控制器放入视图,因为更简单的方法是通过模态,弹出视图或navigationController将控制转移到其他视图控制器。另一种更常用的方法是在XIB中创建多个视图,然后将其加载到空白视图中,而不是为每个视图创建视图控制器。