如何使用 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 segueidStaffTabBar `

第三场比赛 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,即 idStaffTabBaridStudentTabBar 到它。那将解决问题。

答案在这里

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)
}