Swift - 如果条件满足,则转到特定视图

Posted

技术标签:

【中文标题】Swift - 如果条件满足,则转到特定视图【英文标题】:Swift - Segue to a specific view if conditions met 【发布时间】:2015-01-27 16:45:21 【问题描述】:

我有一个标签栏,其中包含一个指向导航控制器的项目,其中包含用户朋友的列表。但是,虽然匿名用户应该能够浏览应用程序,但我只希望登录用户能够查看好友列表,因为只有这样他们才有朋友。我使用 Parse 作为后端,所以我可以测试 PFUser.currentUser(),但我不知道如何告诉导航控制器连接到提示用户登录/注册的 VC(如果他们还没有的话)。提前致谢。

编辑:我已经在标签栏控制器类中实现了建议的解决方案,如下所示:

override func viewDidLoad() 
    super.viewDidLoad()
    tabBarController?.delegate = self


func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool 
    if viewController == FriendsTableViewController() 
        if PFUser.currentUser() != nil 
            println("there is a logged in user")
            return true
         else 
            let authVC:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("auth") as UIViewController
            presentViewController(authVC, animated: true, completion: nil)
            println("attempted to present auth vc")
            return false
        
     else 
        println("not friends table vc")
        return true
    

但是,当我选择朋友栏项目时,没有任何输出。我错过了什么?

编辑:已解决。这是朋友 vc 的视图控制器中 viewWillAppear 的代码:

override func viewWillAppear(animated: Bool) 
    if PFUser.currentUser() == nil 
        var login = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("auth") as AuthenticationVC
        self.presentViewController(login, animated: animated, completion: nil)
    

【问题讨论】:

您是否将tabBarController.delegate 设置为self?另外,我会在您的 not friends table vc else 语句中返回 true,因为您仍然希望能够切换到其他视图,除非您有其他原因返回 false 问题依旧。 委托应该设置在方法调用之外。如果您使用故事板,您可以将连接检查器中的delegate 属性拖到您的视图控制器。如果你是通过代码来做的,你可以在你的 viewDidLoad 方法中设置委托 仍然没有输出。究竟什么时候调用 tabBarController? 【参考方案1】:

我通常实现这一点的方式,这适用于有和没有标签栏的应用程序,是在目标视图控制器中有某种​​需要身份验证标志,如果用户没有登录,则显示登录模态屏幕。

例如在好友列表视图控制器中(假设使用故事板,但差别不大):

override func viewWillAppear(animated: Bool) 
    if PFUser.currentUser() == nil 
        var login = UIStoryboard(name: "MyStoryboard", bundle: nil).instantiateViewControllerWithIdentifier("LoginViewController") as LoginViewController
        //set properties of login 
        self.presentViewController(login, animated: YES)
    

(或使用 performSegue)

恕我直言,模态展示风格在这里更合适,因为它就像用户体验的切线。

【讨论】:

【参考方案2】:

UITabBarControllerDelegate 有一个可以工作的委托方法。您可以使用委托提供的viewController 变量进行检查。

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool 
    if viewController == FriendListViewController() 
        if PFUser.currentUser() != nil 
            return true
        
        else 
            // Prompt login/signup
            return false
        
    

【讨论】:

哪里是放置此代码的最佳位置?据我所知,您不能从任意文件中创建一个到 UI 元素的出口。谢谢。 我完全错过了您问题的标签栏部分。但这个想法仍然有效。代码可以进入tabBarController:shouldSelectViewController:,这是UITabBarControllerDelegate中的一个方法,但不是调用performSegueWithIdentifier,如果用户登录则返回true,如果用户返回false b> 登录。我已经用委托方法更新了答案。

以上是关于Swift - 如果条件满足,则转到特定视图的主要内容,如果未能解决你的问题,请参考以下文章

如果if条件满足,如何跳转到for循环中的特定位置?

Excel VBA:从最大值循环并检查条件

如何根据目标C中StoryBoards中的特定条件转到新视图

ASP .NET MVC:如果不满足特定条件,则重定向到视图

Excel VBA - 基于活动单元格运行宏

如何在 SwiftUI 中启动应用程序时有条件地加载视图?