Objective c 在应用程序恢复上显示登录视图
在appresume上显示视图(在我的例子中是登录屏幕)的最佳方式是什么。环顾四周,我一直在使用AppDelegate中的Objective c 在应用程序恢复上显示登录视图,objective-c,ios,Objective C,Ios,在appresume上显示视图(在我的例子中是登录屏幕)的最佳方式是什么。环顾四周,我一直在使用AppDelegate中的ApplicationIDBecomeActive事件,但我似乎无法了解如何从这里正确显示视图 我试图通过使用self.window和/或它的子视图来获取当前窗口,但从AppDelegateself.window获取的值为零 到目前为止,这个应用程序似乎连接正确,但有两件事让我感到困惑 A) 为什么self.window nil在我的AppDelegate的Applicati
ApplicationIDBecomeActive
事件,但我似乎无法了解如何从这里正确显示视图
我试图通过使用self.window
和/或它的子视图来获取当前窗口,但从AppDelegateself.window
获取的值为零
到目前为止,这个应用程序似乎连接正确,但有两件事让我感到困惑
A) 为什么self.window nil在我的AppDelegate的ApplicationIDBecomeActive
事件处理程序中
B) 在应用程序简历上显示登录视图(或类似内容)的正确/正常方式是什么。Jason
我曾参与过Chris Lowe在raywenderlich.com上提供的安全教程,该教程旨在演示如何使用基本的iOS安全性来锁定应用程序
不过,本教程的前提是,应用程序将在首次启动时提示登录,如果在VIEWDID中使用NSNoftificationCenter解锁设备时恢复应用程序,则加载并订阅通知:deviceWillLock和deviceWillUnlock。所有这些都假定设备设置为锁定
-这是具有NSNotification注册的零件
-为了清晰起见,这是本教程的第一部分。为所有应用程序实现自定义UIViewController。在此视图中,
视图中的控制器实现逻辑将显示
消息,以确定并显示登录屏幕(如有必要)
//CustomViewController.h
@interface CustomViewController : UIViewController
@end
//CustomerViewController.m
@implementation CustomViewController
-(void)viewWillAppear:(BOOL)animated{
if(login_required){
LoginViewController *loginView = [[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil];
[self presentModalViewController:loginView animated:false];
}
}
@end
然后,简单地说,在登录视图控制器中,确保调用:
[self dismissModalViewControllerAnimated:false];
这种方法的好处是双重的。首先,它是一个非常简单的实现。然而,最令人信服的是,为应用程序的视图控制器提供基类提供了提取公共逻辑的机会。我在研究解决方案时也遇到了这个问题。我不想为我的视图创建中间的超类,我也不确定如何使用导航控制器。我已经想出了另一个对我很有效的解决方案——所以我想我会分享它。它基于
NSNotificationCenter
的使用
在应用程序中,委托创建一个属性以保存对当前显示的视图控制器的引用-例如currentViewController
然后在ApplicationIDFinishLaunching
方法中,注册块观察者以更新currentViewController
属性,如下所示:
[[NSNotificationCenter defaultCenter] addObserverForName:@"CurrentViewChanged"
object:nil
queue:nil
usingBlock:^(NSNotification *note)
{self.currentViewController = (UIViewController *)note.object;} ];
在视图控制器实现中,通过添加以下行,更新viewdideappear
方法以通知观察者正在显示新的视图控制器
[[NSNotificationCenter defaultCenter] postNotificationName:@"CurrentViewChanged" object:self];
最后,在应用程序委托的ApplicationIDBecomeActive方法中包含代码,以强制以模式显示登录屏幕
UIStoryboard *mainStoryBoard = self.window.rootViewController.storyboard;
UnlockViewController *uvc = [mainStoryBoard instantiateViewControllerWithIdentifier:@"modalUnlockView"];
uvc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self.currentViewController presentViewController:uvc animated:YES completion:NULL];
需要注意的几个附加项目:-
nil
applicationdFinishLaunching
方法中包含以下行
self.currentViewController=self.window.rootViewController代码>
谢谢也许可以重新考虑一下。由于应用程序已恢复,是否确实要显示登录?或者您想显示登录名,因为它是查看当前视图所必需的?如果用户登录,我会检查每个视图。如果不是,则显示模式登录视图。这几乎涵盖了所有内容,而不必担心应用程序是否刚刚恢复。您是否尝试过类似的操作
[self.rootViewController presentModalViewController:loginController]代码>?@StevenStefanik,整个应用程序需要登录。我想我可以从一个基本控制器中获得所有控制器的固有功能,并在视图中实现逻辑将出现
处理程序,但似乎AppDelegate就是实现此功能的地方。。。我错了吗?@RomanTemchenko,AppDelegate没有rootViewController属性。这里有一个self.window.rootViewController,但是self.window也是nil。这个解决方案的主要灵感来自Steven Stefanik的评论。我曾鼓励他将此作为正式答复,但他没有这样做@如果你想获得荣誉,我很乐意删除我的答案,接受你的答案。在那之前,我觉得这是正确的答案。谢谢你的帮助!如果您的类继承自UITableViewController,您建议执行什么操作。。。不仅仅是UIViewController?