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 - 如果条件满足,则转到特定视图的主要内容,如果未能解决你的问题,请参考以下文章
如何根据目标C中StoryBoards中的特定条件转到新视图