我正在构建一个使用故事板的IOS 5.1 Web客户端应用程序。我的一个动作是“注销”,在此期间我想将我的根视图重置为由故事板的根视图创建的初始视图。 (当您登录时,根据您的身份删除或添加一些视图项;当您注销时,我想将它们重置为默认值,我在故事板中指定了这些值。)
我意识到我可以通过编程方式重置/重新添加所有元素,但那么故事板有什么用呢?我认为必须通过重新加载视图文件来回到原点,对吧?
答案 0 :(得分:28)
我发现以下方法对我有用。请注意,我使用ARC,但不确定这是否对解决方案有很大影响。首先,在app委托类中,在application:didFinishLaunchingWithOptions:
中,我使用以下代码行捕获初始Storyboard实例:
_initalStoryboard = self.window.rootViewController.storyboard;
(显然有一个实例变量UIStoryboard* _initalStoryboard;
)
然后我在我的app delegate中定义了以下函数:
- (void)resetWindowToInitialView
{
for (UIView* view in self.window.subviews)
{
[view removeFromSuperview];
}
UIViewController* initialScene = [_initalStoryboard instantiateInitialViewController];
self.window.rootViewController = initialScene;
}
请注意for in循环,它会删除window
中的所有子视图。 UIWindow rootViewController文档说明:
如果窗口具有现有视图层次结构,则旧视图为 在安装新的之前删除。
但是我没有发现这种情况......所以在分配新的rootViewController之前我自己删除了现有的视图。使用这种方法我没有发现任何令人担忧的副作用或内存泄漏。我绝不是UIKit神奇的专家所以如果你打算自己使用它,我会建议你测试并重新测试这个解决方案。干杯
答案 1 :(得分:2)
如果您使用基于NavController的结构,以下内容对我很有用:
UIWindow *window = [[UIApplication sharedApplication].windows firstObject];
UINavigationController *navController = (UINavigationController *)window.rootViewController;
UIViewController *vc = [navController.storyboard instantiateViewControllerWithIdentifier:@"Login"];
navController.viewControllers = @[vc];
您必须分配故事板ID"登录"到您的登录VC,以使其工作。
答案 2 :(得分:0)
如果我使用基于double result = 0;
if (double.TryParse(Amt.Text, out result)
{
Amt.Text = result.ToString("N");
}
的结构(在iOS 8 +上测试),以下适用于我:
从项目中移除故事板常规 - > 部署信息,因此下拉列表如下所示,您必须在代码中配置故事板。
UISplitViewController
AppDelegate.m
为避免代码重复,请从- (void)setupViewControllers
{
// check for thread, as this method might be called by other (e.g. logout) logic
if ([NSThread currentThread] != [NSThread mainThread]) {
dispatch_async(dispatch_get_main_queue(), ^{
[self setupViewControllers];
});
return;
}
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
UIViewController *vc =[storyboard instantiateInitialViewController];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = vc;
// configure split vc
// Note: I reference split vc for my own purpose, but it is your mater of choice
self.splitViewController = (UISplitViewController *)self.window.rootViewController;
self.splitViewController.delegate = self;
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;
self.splitViewController.preferredPrimaryColumnWidthFraction = 0.5;
[self.window makeKeyAndVisible];
}
调用此函数作为首次设置
application:didFinishLaunchingWithOptions:
在视图控制器中,您已准备好向用户显示UI,删除初始视图。例如(在Swift中):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// some code...
[self setupViewControllers];
// Optional: add splash view (e.g. [self addSplashView];)
// some code...
}