【问题标题】:Swift - Segue to a specific view if conditions metSwift - 如果条件满足,则转到特定视图
【发布时间】: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?

标签: ios swift uiviewcontroller parse-platform uistoryboardsegue


【解决方案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> 登录。我已经用委托方法更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2021-04-28
    • 2023-03-13
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多