Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在应用程序恢复上显示登录视图_Objective C_Ios - Fatal编程技术网

Objective c 在应用程序恢复上显示登录视图

Objective c 在应用程序恢复上显示登录视图,objective-c,ios,Objective C,Ios,在appresume上显示视图(在我的例子中是登录屏幕)的最佳方式是什么。环顾四周,我一直在使用AppDelegate中的ApplicationIDBecomeActive事件,但我似乎无法了解如何从这里正确显示视图 我试图通过使用self.window和/或它的子视图来获取当前窗口,但从AppDelegateself.window获取的值为零 到目前为止,这个应用程序似乎连接正确,但有两件事让我感到困惑 A) 为什么self.window nil在我的AppDelegate的Applicati

在appresume上显示视图(在我的例子中是登录屏幕)的最佳方式是什么。环顾四周,我一直在使用AppDelegate中的
ApplicationIDBecomeActive
事件,但我似乎无法了解如何从这里正确显示视图

我试图通过使用
self.window
和/或它的子视图来获取当前窗口,但从AppDelegate
self.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?