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

第三轮 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,即idStaffTabBaridStudentTabBar 链接到它。这样就可以解决问题了。

【讨论】:

如果我在自定义导航控制器类中添加 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用查询快速获取 cloudkit 数据

如何从 CloudKit 查询和获取数据?

如何进行包含令牌搜索的 CloudKit 全文搜索

如何制作 Segue Pass 数据并且仅在满足某些条件时执行

如何在 CloudKit 中查询 recordID [CKRecordID]

我如何通过其记录名称查询 CloudKit 以获取特定记录?