如何使用 CloudKit 查询条件 segues?
Posted
技术标签:
【中文标题】如何使用 CloudKit 查询条件 segues?【英文标题】:How to condition segues using CloudKit query? 【发布时间】:2015-11-10 11:39:18 【问题描述】:我创建了一个由 CloudKit 备份的登录页面。 我想知道如果登录名具有特定值,如何创建条件转场,然后根据该值将用户引导到视图控制器
具体来说,我要连接三个 Segue:
登录 id segue:
LoginSuccessSegue
员工标签栏 id segue:
idStaffTabBar
学生标签栏 id segue:
idStudentTabBar
第一次转场
LoginSuccessSegue
:
登录视图控制器有一个 show segue id LoginSuccessSegue 连接到员工标签栏控制器和学生标签栏控制器。
第二次转场
idStaffTabBar
:
执行queryProfileType()
后,它会在列表中查找配置文件类型,以检查用户配置文件是教师值还是其他值。然后,如果这是真的,“LoginSuccessSegue”将自动将用户带到员工标签栏控制器,“StaffBookedVC.self”,使用its segue
idStaffTabBar`
第三轮
idStudentTabBar
:
如果用户不是老师,则在按下登录按钮后重定向到学生标签栏控制器,“stdBookingVC.self”使用 idStudentTabBar 或
如何在多个视图中使用 segues 和云套件查询实现自动条件登录?
这是登录按钮的代码:
@IBAction func btnSignInTapped(sender: UIButton)
let userEmailAddress = userEmailAddressTextField.text
let userPassword = userPasswordTextField.text
if(userEmailAddress!.isEmpty || userPassword!.isEmpty)
notifyUser("Empty fields", message: "all fields are required")
print("fetching is in progress")
queryProfileType()
print("\nfetching had stopped")
//end of signInbtn
func queryProfileType()
queryCredentials()
print("\nProfile Query starting")
//execute query
let organizers = ["Teacher || Youtuber || Instagrammer || "]
let predicate = NSPredicate(format: "ProfileType = '\(organizers)' ")
print("\nThis is the predicate\n\(predicate)")
let query = CKQuery(recordType: "RegisteredAccounts", predicate: predicate)
publicDatabase!.performQuery(query, inZoneWithID: nil) results, error in
if (error != nil)
print(error)
else
if (results! == organizers)
self.performSegueWithIdentifier("idStaffTabBar", sender: StaffBookedVC.self)
else
self.performSegueWithIdentifier("idStudentTabBar", sender: stdBookingVC.self)
print("\(results)\nthese are the printed results")
let firstFetch = CKFetchRecordsOperation()
let secondFetch = CKFetchRecordsOperation()
secondFetch.addDependency(firstFetch)
let queue = NSOperationQueue()
queue.addOperations([firstFetch, secondFetch], waitUntilFinished: false)
这是故事板的图片Storyboard
如果您的答案将包含这些方法,请给我一些示例: shouldPerformSegueWithIdentifier 和 prepareForSegue
这对我也不起作用
self.presentViewController(SignInNavigationVCTabBars, animated: true,
results, error in
if (results! == organizers)
self.performSegueWithIdentifier("idStaffTabBar", sender: StaffUITABbarVC.self)
else
self.performSegueWithIdentifier("idStudentTabBar", sender: StdUITABbarVC.self)
`
【问题讨论】:
不清楚问题本身。但是你的做法是正确的。根据不同的情况,你会用不同的标识符调用performSegueWithIdentifier
程序在条件处停止。如果有谁可以帮忙,请分享你的答案
您需要调试程序在哪里停止,在什么条件下停止?在 ViewController 更改时停止?停在segue?尝试在 prepareForSegue 中设置一个断点。
这是错误:*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<appname.MasterViewController: 0x7d27d7a0>) has no segue with identifier 'idStudentTabBar'' *** First throw call stack:
>是因为在这个my storybaord 中看不到主视图和标签栏视图之间的导航控制器吗?
您的故事板没有 ID 为 idStudentTabBar 的视图。确保你有那一套。
【参考方案1】:
您需要先在queryProfileType
方法中执行presentModalViewController
之类的操作来显示navigationController
。然后在加载navigationController
之后执行一些智能逻辑来确定要走的路线。所以需要一个自定义的UINavigationController
。
或者一种更简单的方法:
将您的loginViewController
移动到导航控制器堆栈中,然后将两个现有的segues,即idStaffTabBar
和idStudentTabBar
链接到它。这样就可以解决问题了。
【讨论】:
如果我在自定义导航控制器类中添加 queryProfileType 会怎样?你觉得这样行吗? 这不是一个好主意。如果登录失败,您想留在登录视图上,我相信这是queryCredentials
的功能。是什么阻止您将登录屏幕移动到导航控制器的“右侧”?
self.presentViewController(navigationController:SignInNavigationVCTabBars, animated: true, completion: nil)
说:无法将“SignInNavigationVCTabBars.Type”类型的值转换为预期的参数类型“UIViewController”
SignInNavigationVCTabBars
不是NavigationController
【参考方案2】:
这就是答案
我没想到 valueforkey 会拥有一切 我能看到什么?永远不要停止尝试
//log in function
func queryCredentials()
print("*********\nQueryCredentials starting")
// System indicator
let spinningActivity = MBProgressHUD.showHUDAddedTo(self.view, animated: true)
spinningActivity.labelText = "Signing in"
spinningActivity.detailsLabelText = "Please wait"
// querying predicate in cloud kit to check via email and password property
let predicate = NSPredicate(format: "Email = %@", userEmailAddressTextField.text!)
let query = CKQuery(recordType: "RegisteredAccounts", predicate: predicate)
publicDatabase?.performQuery(query, inZoneWithID: nil,
completionHandler: (results, error in
if (error != nil)
dispatch_async(dispatch_get_main_queue())
// if the user is not signed, display this error
self.notifyUser("Cloud Access Error",
message: "to fix this error Sign in you icloud \n go to settings\nthen sign in icloud account\n error code:\(error!.localizedDescription)")
else
if (results!.count > 0)
// the results after success case of the query
let record = results![0] as! CKRecord
// read from the result to navigate via profiletype attribute
let proftype = record.valueForKey("ProfileType") as! String
switch proftype
case("Teacher"):
self.staffView()
break;
case("Manager"):
self.staffView()
break;
case("Student"):
// stdView() is a student coded segue as a function to navigate to student view
self.stdView()
break;
case("Worker"):
self.stdView()
break;
default:
break;
self.currentRecord = record
dispatch_async(dispatch_get_main_queue())
// if credentials are correct, display you are logged in
self.userPasswordTextField!.text =
record.objectForKey("Password") as! String
self.notifyUser("Welcome", message: "You are loogedin")
else
dispatch_async(dispatch_get_main_queue())
self.notifyUser("No Match Found",
message: "No record matching")
))
// hiding indicator
spinningActivity.hide(true)
【讨论】:
我删除了导航栏,在登录页面添加了staff segue = self.staffView() 和student segue self.stdView()。 valueforkey 将从云套件中读取 proftype,然后导航到 segues以上是关于如何使用 CloudKit 查询条件 segues?的主要内容,如果未能解决你的问题,请参考以下文章
如何制作 Segue Pass 数据并且仅在满足某些条件时执行