2015-03-31 58 views
14

我在我的應用程序的註冊過程中使用Twitter登錄。我要求用戶的電子郵件。一旦我得到它,我想提出一個UIAlertController。Swift嘗試呈現其視圖不在窗口層次結構中的UIAlertController(在TWTRShareEmailViewController之後呈現)

這裏是我的代碼:

func askForTWMail(){ 
    if (Twitter.sharedInstance().session() != nil) { 
     let shareMailVC=TWTRShareEmailViewController(completion: {(mail:String!, error:NSError!) in 
      if (mail != nil) { 
       print("GOT MAIL: \(mail)") 
       self.gotMail() 
      }else{ 
       print("MAIL VC ERROR: \(error)") 
      } 
     }) 
     println("PRESENT MAIL VC") 
     self.presentViewController(shareMailVC, animated: true, completion: nil) 
    }else{ 
     println("User not logged in") 
    } 
} 

func gotMail(){ 
    var alertController=UIAlertController(title: "Some title", message: "Some message", preferredStyle: UIAlertControllerStyle.Alert) 
    var okAction=UIAlertAction(title:"Yes", style: UIAlertActionStyle.Default) { 
    UIAlertAction in 
    //some action 
    } 
    var cancelAction=UIAlertAction(title:"No", style: UIAlertActionStyle.Cancel){ 
    UIAlertAction in 
    //some action 
    } 
    alertController.addAction(okAction) 
    alertController.addAction(cancelAction) 
    self.presentViewController(alertController, animated: true, completion: nil)     
} 

但我得到這個錯誤(我猜是因爲TWTRShareEmailViewController沒有被駁回):

警告:試圖提出UIALertController上xViewController其 看法是不在窗口層次結構中!

任何想法,我應該寫這個?我如何知道TWTRShareEmailViewController何時被解僱以繼續註冊過程並能夠呈現我的UIAlertController?我不知道與TWTRShareEmailViewController相關的代理方法。

任何幫助表示讚賞。謝謝。

回答

31

找到解決方案here。我可能做錯了,但如果不是,它可能是一個蘋果的錯誤。解決方法是推遲UIAlertController的呈現:

dispatch_async(dispatch_get_main_queue(), ^{ 
    self.presentViewController(alertController, animated: true, completion: nil) 
}) 

編輯:我發現了另一個解決方法(我不使用我放下這裏了該解決方案)。我不得不改變這個,因爲Twitter登錄也打破了我在VC之間的轉換。

我現在打電話給一個特定的UIViewController(我稱之爲TWLoginVC),我在那裏做所有的Twitter登錄和其他的東西。該視圖只是黑色的,所以用戶看不到該流程實際上是在另一個VC中完成的(他只需拿起他想要登錄的Twitter用戶)。我想你也可以把清晰的背景變得更加隱形。

當我調用這個視圖控制器並關閉它時,轉換不適用於它,我沒有任何問題。


編輯 更新斯威夫特:

DispatchQueue.main.async{ 
    self.present(alertController, animated: true, completion: nil) 
} 
+0

您是否找到針對此問題的更好解決方案?我也在使用dispatch_async – 2016-03-04 15:50:46

+0

正如我在編輯回覆中解釋的那樣,我有一個專門針對Twitter的東西。因此,當用戶想用Twitter登錄時,我模式地展示了我的'TWLoginVC',其中的一切都完成了(在某些情況下避免了奇怪的行爲,例如VC之間的特殊轉換)。但是我改了一下我的代碼,我不需要再提供一個UIAlertController。所以沒有抱歉,我沒有更好的解決方案:/ – 2016-03-04 17:43:58

+1

隨着新的TwitterKit(我剛剛更新到2.0版。2),要求更改用戶電子郵件的方式。它在Twitter文檔中解釋:https://docs.fabric.io/ios/twitter/request-user-email-address.html。 – 2016-04-22 12:56:26

5

下面是斯威夫特3更新的答案基於瑪麗DM的回答上的Xcode 8測試。

DispatchQueue.main.sync { 
    self.present(alertController, animated: true, completion: nil) 
} 
-1

如果DispatchQueue.main.sync造成擠壓,嘗試DispatchQueue.main.async。 「異步」爲我的問題工作,而從contactPicker()返回。

相關問題