在注销时重置故事板

Jas*_*son 20 xib uiviewcontroller nib ios

我正在构建一个使用故事板的IOS 5.1 Web客户端应用程序.我的一个动作是"注销",在此期间我想将我的根视图重置为由故事板的根视图创建的初始视图.(当您登录时,根据您的身份删除或添加一些视图项;当您注销时,我想将它们重置为默认值,我在故事板中指定了这些值.)

我意识到我可以通过编程方式重置/重新添加所有元素,但故事板有什么用?我认为必须通过重新加载视图文件来回到正方形,对吧?

Her*_*mps 28

我发现以下方法对我有用.请注意,我使用ARC,但不确定这是否对解决方案有很大影响.首先,在app delegate类中,application:didFinishLaunchingWithOptions:我使用以下代码行捕获初始Storyboard实例:

_initalStoryboard = self.window.rootViewController.storyboard;
Run Code Online (Sandbox Code Playgroud)

(显然有一个实例变量UIStoryboard* _initalStoryboard;)

然后我在我的app delegate中定义了以下函数:

- (void)resetWindowToInitialView
{
    for (UIView* view in self.window.subviews)
    {
        [view removeFromSuperview];
    }

    UIViewController* initialScene = [_initalStoryboard instantiateInitialViewController];
    self.window.rootViewController = initialScene;
}
Run Code Online (Sandbox Code Playgroud)

请注意for循环中删除所有子视图window.UIWindow rootViewController文档说明:

如果窗口具有现有视图层次结构,则在安装新视图之前将删除旧视图.

但是我没有发现这种情况......所以在分配新的rootViewController之前我自己删除了现有的视图.使用这种方法我没有发现任何令人担忧的副作用或内存泄漏.我绝不是UIKit神奇的专家所以如果你打算自己使用它,我建议你测试并重新测试这个解决方案.干杯

  • 看看这个问题:http://stackoverflow.com/questions/1184146/getting-a-reference-to-the-uiapplication-delegate它显示了如何获得对您的应用代表的引用 - 在您的情况下,您将在场景的视图控制器中使用它.因此,在按钮的触摸处理程序中,您将拥有类似的内容:MyApplicationDelegate*appDelegate =(MyApplicationDelegate*)[[UIApplication sharedApplication] delegate]; [appDelegate resetWindowToInitialView]; (2认同)
  • 而不是**for**可以使用更优雅的解决方案:`[self.window.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]` (2认同)