如何使用 CloudKit 查询条件 segues?
How to condition segues using CloudKit query?
我创建了一个由 CloudKit 支持的登录页面。
我想知道如何在登录具有特定值的情况下创建条件转场,然后根据该值将用户定向到视图控制器
具体来说,我要连接三个Segues:
sign in id segue:LoginSuccessSegue
staff tab bar id segue:idStaffTabBar
student tab bar id segue:idStudentTabBar
第一次转场
LoginSuccessSegue
:
登录视图控制器有一个 show segue id LoginSuccessSegue 连接到员工选项卡栏控制器和学生选项卡栏控制器。
第二次转场
idStaffTabBar
:
queryProfileType()
执行后,它将在列表中查找配置文件类型,以检查用户配置文件是教师值还是其他值。然后如果这是真的 "LoginSuccessSegue" 将自动将用户带到员工标签栏控制器,"StaffBookedVC.self" 通过使用 its segue
idStaffTabBar `
第三场比赛
idStudentTabBar
:
如果用户不是教师,则在按下登录按钮后重定向到学生标签栏控制器,"stdBookingVC.self" 通过使用 idStudentTabBar 或
How can I achieve an automatic conditional sign in in multiple views suing segues and cloud kit query?
这是登录按钮的代码:
@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)
}
}
`
您需要先在 queryProfileType
方法中执行 presentModalViewController
之类的操作来显示 navigationController
。然后在 navigationController
加载后做一些智能逻辑来确定走哪条路线。所以需要自定义 UINavigationController
。
或者更简单的方法:
将您的 loginViewController
移动到导航控制器堆栈中,然后 link 两个现有的 segue,即 idStaffTabBar
和 idStudentTabBar
到它。那将解决问题。
答案在这里
I did not expect valueforkey would have it all
what can I see? never stop trying
//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)
}
我创建了一个由 CloudKit 支持的登录页面。 我想知道如何在登录具有特定值的情况下创建条件转场,然后根据该值将用户定向到视图控制器
具体来说,我要连接三个Segues:
sign in id segue:
LoginSuccessSegue
staff tab bar id segue:
idStaffTabBar
student tab bar id segue:
idStudentTabBar
第一次转场
LoginSuccessSegue
:
登录视图控制器有一个 show segue id LoginSuccessSegue 连接到员工选项卡栏控制器和学生选项卡栏控制器。
第二次转场
idStaffTabBar
:
queryProfileType()
执行后,它将在列表中查找配置文件类型,以检查用户配置文件是教师值还是其他值。然后如果这是真的 "LoginSuccessSegue" 将自动将用户带到员工标签栏控制器,"StaffBookedVC.self" 通过使用 its segue
idStaffTabBar `
第三场比赛
idStudentTabBar
:
如果用户不是教师,则在按下登录按钮后重定向到学生标签栏控制器,"stdBookingVC.self" 通过使用 idStudentTabBar 或
How can I achieve an automatic conditional sign in in multiple views suing segues and cloud kit query?
这是登录按钮的代码:
@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)
}
}
`
您需要先在 queryProfileType
方法中执行 presentModalViewController
之类的操作来显示 navigationController
。然后在 navigationController
加载后做一些智能逻辑来确定走哪条路线。所以需要自定义 UINavigationController
。
或者更简单的方法:
将您的 loginViewController
移动到导航控制器堆栈中,然后 link 两个现有的 segue,即 idStaffTabBar
和 idStudentTabBar
到它。那将解决问题。
答案在这里
I did not expect valueforkey would have it all what can I see? never stop trying
//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)
}