Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 访问用户通讯簿的权限警报不会停止执行_Ios_Swift_Methods_Switch Statement_Abaddressbook - Fatal编程技术网

Ios 访问用户通讯簿的权限警报不会停止执行

Ios 访问用户通讯簿的权限警报不会停止执行,ios,swift,methods,switch-statement,abaddressbook,Ios,Swift,Methods,Switch Statement,Abaddressbook,我有一个按钮可以从用户的通讯簿中导入联系人。当他们第一次点击按钮时,我的代码返回一个bool,指示用户是否授予了权限。如果授予了权限,则将导入联系人,我将执行到表视图的转换。如果未授予权限,则不会导入联系人,我将对空表视图执行相同的步骤。以下是我所拥有的: func myImportThenSegueFunction() { if userHasAuthorizedAddressBookAccess() == true { // Import contacts and p

我有一个按钮可以从用户的通讯簿中导入联系人。当他们第一次点击按钮时,我的代码返回一个bool,指示用户是否授予了权限。如果授予了权限,则将导入联系人,我将执行到表视图的转换。如果未授予权限,则不会导入联系人,我将对空表视图执行相同的步骤。以下是我所拥有的:

func myImportThenSegueFunction() {
    if userHasAuthorizedAddressBookAccess() == true {
        // Import contacts and perform segue
    } else {
        // Just perform segue
    }
}

func userHasAuthorizedAddressBookAccess() -> Bool {
    switch ABAddressBookGetAuthorizationStatus() {
    case .Authorized:
        return true
    case .NotDetermined:
        var userDidAuthorize: Bool!
        ABAddressBookRequestAccessWithCompletion(nil) { (granted: Bool, error: CFError!) in
            if granted {
                userDidAuthorize = true
            } else {
                userDidAuthorize = false
            }
        }
        return userDidAuthorize
    case .Restricted:
        return false
    case .Denied:
        return false
    }
}
问题在于,当点击按钮时,访问权限设置警报会短暂显示,而在警报提示中,在用户授予或拒绝访问权限之前,视图会在后台执行该步骤。然后应用程序立即崩溃,表示.NotDetermined返回了nil,这意味着在用户甚至可以在ABAddressBookRequestAccessWithCompletionnil的if/else块中选择设置UserDidAuthority之前,就返回了变量UserDidAuthority

我的问题是,为什么代码在case.NotDetermined中执行return,在用户设置变量userDidAuthorize以通过警报提示返回正确的bool之前?我见过一些黑客将执行过程包装成一个时间延迟,我知道这个功能已经被弃用了。如何使其正常工作?

因为ABAddressBookRequestAccessWithCompletion是异步的,并且会立即返回。它需要像这样,因为它通常是从主线程使用的,并且在请求用户权限时不能阻止

您需要改变使用它的方式来接受这一点,方法是在知道状态后调用一个状态为的完成块,而不是立即返回状态