0

我正在覆盖 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

4 回答 4

0

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

问题不可能出在您创建的方式上ABCFormView吗?我的意思是,原来的视图似乎被一个空视图所取代,所以检查后者是如何创建的......

发表评论后编辑:

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

@property (...) ABCFormViewController* newviewController;

....

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

请记住,newviewController只要您使用它的受控,它就必须在附近view,否则您会崩溃。这就是我将其引用存储在属性中的原因。

于 2012-06-14T15:32:10.333 回答
0

如果不知道 ABCFormViewController 内部是什么,就很难分辨。我曾经在视图控制器上遇到了一些计时问题,我只需要生成视图,因为我想捕获它的内容以创建一个 pdf 文件(它的视图永远不会显示在屏幕上)。在那种情况下,我需要插入这样的代码:

    [newviewcontroller.view setneedsrefresh]; 

在我做之前

     otherVC.view = newviewcontroller.view;

否则我会得到一个空白页。我相信我明白了这一点,因为当一切都整理好时,ARC 会释放 newviewcontroller,因此视图为零。在您的情况下,这可能不是问题。您是否需要将第二个和第三个视图控制器放入您的视图中,因为这样做更简单的方法是通过模态、弹出视图或导航控制器将控制权转移到其他视图控制器。另一种更常用的方法是在 XIB 中创建多个视图,然后将其加载到空白视图中,而不是为每个视图创建视图控制器。

于 2013-09-25T01:23:40.267 回答
0

显然你不能通过简单地设置 self.view = newView; 来让你的新视图可见。因为 newView 从未作为子视图添加到任何其他视图中 - 即不在窗口中。

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

于 2012-06-15T03:49:40.240 回答
0

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

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

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

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

于 2012-06-15T04:09:54.307 回答