从应用代理中关闭模态视图控制器

4

我正在使用Facebook SDK来登录我的应用程序。如果用户未登录,则登录VC模态出现。一旦用户点击登录,它会向App Delegate提醒登录是否成功。如果成功,我想从应用程序委托中解除模态登录VC。我该如何做到这一点?

2个回答

7
您可以尝试关闭当前显示的视图控制器,因为必须有某个东西来呈现模态视图控制器。
UINavigationController *navigationController = (id) self.window.rootViewController;
[[navigationController presentedViewController] dismissModalViewControllerAnimated:NO];

如果您想检查特定的视图控制器是否正在显示(即仅在显示某个特定视图控制器时才取消显示),则可以添加检查。

UIViewController *viewController = [navigationController presentedViewController];

if ([viewController isMemberOfClass:[YourViewController class]]) {
    [viewController dismissModalViewControllerAnimated:NO];
}

4
appDelegate需要知道当前托管的viewController是谁,以便可以发送dismiss消息。您需要想出一种方法来实现这一点。一种方法是在appDelegate上定义一个ivar“callDismissOnMeIfFaceBookFails”,并在此情况下设置它,否则为nil。
请注意,如果为nil,则appDelegate可以无任何开销或问题发送dismiss消息!利用nil消息的优势(我经常使用它)。[另外:我看到很多代码“if(obj)[obj message];”不要这样做-if-只需发送消息-如果obj为nil,则没有效果并且处理效率高!]
编辑:
所以你有一个类AppDelegate。在#interface中定义一个属性:
@property (nonatomic, strong) UIViewController *callDismissOnMeIfFaceBookFails;

在实现中,您需要使用 @synthesize 对其进行合成。定义一个方法:
- (void)dismissLoginView
{
  [callDismissOnMeIfFaceBookFails dismissModalViewControllerAnimated:YES];
  callDismissOnMeIfFaceBookFails = nil; // don't need it now, this unretains it
}

因此,在模态视图控制器呈现之前,呈现对象将appDelegate属性“callDismissOnMeIfFaceBookFails”设置为自身。

当用户成功登录时,登录对象向appDelegate发送消息,告诉它关闭登录视图。


我理解第一部分,即AppDelegate显然需要知道托管视图控制器是谁。然而,在此之后,我有点困惑。我仍在学习Objective-C,我不太确定您所说的“在appDelegate上定义一个ivar“callDismissOnMeIfFaceBookFails”,并在此情况下设置它,否则为nil”的含义。您能否提供一个快速示例?非常感谢您迄今为止的帮助。 - Alex Godbehere
非常感谢!我会尝试一下,并告诉您我的进展情况。 - Alex Godbehere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接