重新加载 iOS 视图控制器

Posted

技术标签:

【中文标题】重新加载 iOS 视图控制器【英文标题】:Reloading an iOS View Controller 【发布时间】:2014-11-04 20:20:00 【问题描述】:

我有一个使用 Parse 创建 PFLogInViewController 的单视图应用程序。在可以访问 BeaconViewController 之前,用户必须通过 Facebook 进行身份验证 - 这工作正常。我的问题是注销部分 - 用户会话被破坏后,我需要 PFLogInViewController 重新出现。我试图通过弹出RootViewController 来完成此操作,但这并不能解决问题。

我引用了this 线程以及this 一个,但再次没有任何运气。

这里是BeaconViewController.m,带有身份验证和注销逻辑

-(void)viewDidAppear:(BOOL)animated 
    [super viewDidAppear:animated];

    FBRequest *request = [FBRequest requestForMe];
    [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
        if (!error) 
            [self dismissViewControllerAnimated:YES completion:nil];
            [self pictureRequest];
        
        else if (error) 
            NSLog(@"facebook session was invalid");
            [self logoutButtonAction:nil];
            PFLogInViewController *login = [[PFLogInViewController alloc] init];
            login.fields = PFLogInFieldsFacebook;
            login.delegate = self;
            NSArray *permissionsArray = @[ @"user_about_me", @"user_relationships", @"user_birthday", @"user_location"];
            login.facebookPermissions = permissionsArray;
            [self presentViewController:login animated:YES completion:nil];
        
        else 
            NSLog(@"Some other error: %@", error);
        
    ];



- (IBAction)logoutButtonAction:(id)sender 
    [PFUser logOut];
    [self.navigationController popToRootViewControllerAnimated:YES];

【问题讨论】:

仅供参考。 viewDidLoadviewDidAppear 不适合你打电话。它们是供系统调用的。 另外,请解释反对意见 - 我事先已尽我所能对此进行了研究,并提供了必要的背景细节 您应该尝试以更通用的方式表达您的问题,并将其与项目的不相关细节(PFViewController、Facebook、等等)脱钩。同时,您遗漏了基本信息(哪个控制器正在呈现此控制器)。虽然我知道您的问题的原因是什么(您不能从即将显示的视图控制器中关闭并重新显示视图控制器),但解决方案是阅读视图控制器的基础知识,而不是绕过您的缺少正确使用视图控制器的基本知识:bit.ly/1pifOy5 @auco 我多么幸运能得到你的智慧之言——再加上你的 ViewControllers 简介链接,让我成为最幸运的人,能够在我们都称之为家的这个蓝色大斑点上行走。感谢您对像我这样愚蠢的学生不屑一顾。 @Anconia:我会把它当作一种恭维 :-) 我确实记得开始为 ios 编写代码并不容易,因为你真的想了解很多(非常聪明 - 但对于初学者经常混淆)软件设计模式和一般概念(“不要与框架作斗争”)。 Esp ViewControllers 是 iOS 上一个非常重要的概念。但是,一旦您掌握了全局,您就可以正确使用它们并开始拥抱 Apple 工程之美 ;-) 【参考方案1】:

尝试使用:

  [self.navigationController popViewControllerAnimated:YES];

【讨论】:

【参考方案2】:

将您的 segue 类型更改为 push。在您的 IBAction 操作方法中添加这行代码。

- (IBAction)logoutButtonAction:(id)sender

   [self.navigationController popViewControllerAnimated:YES];

【讨论】:

【参考方案3】:

我通过将 PFLogInViewController 的呈现逻辑抽象到一个辅助方法中并在注销时调用它来解决这个问题。

-(void)viewDidAppear:(BOOL)animated 
    [super viewDidAppear:animated];

    FBRequest *request = [FBRequest requestForMe];
    [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) 
        if (!error) 
            [self dismissViewControllerAnimated:YES completion:nil];
            [self pictureRequest];
        
        else if (error) 
            NSLog(@"facebook session was invalid");
            [self logoutButtonAction:nil];
            [self presentPFLogInViewController];
        
        else 
            NSLog(@"Some other error: %@", error);
        
    ];


-(void)presentPFLogInViewController 
    PFLogInViewController *login = [[PFLogInViewController alloc] init];
    login.fields = PFLogInFieldsFacebook;
    login.delegate = self;
    NSArray *permissionsArray = @[ @"user_about_me", @"user_relationships", @"user_birthday", @"user_location"];
    login.facebookPermissions = permissionsArray;
    [self presentViewController:login animated:YES completion:nil];


- (IBAction)logoutButtonAction:(id)sender 
    [PFUser logOut];
    [self presentPFLogInViewController];

【讨论】:

以上是关于重新加载 iOS 视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

从 iOS 中的 UIView 子视图重新加载时 UITableView 未重新加载

如果从不同的视图控制器按下返回,则重新加载而不重新加载。迅速

从情节提要重新加载视图时,以编程方式添加的 iOS 子视图会丢失

iOS:加载另一个视图控制器的 uiview

从 iOS 11 搜索控制器导航时不需要的 UITableView 重新加载动画

IOS表视图中的数据加载问题