2016-05-16 49 views
0

我的應用程序工作正常,沒有3Dtouch實施;但隨着3Douch添加應用程序繼續工作很好,並正常旋轉,直到使用3D觸摸(偷看或流行);我有一個tableViewCell處理偷看/流行和預覽委託。演示將做兩次,並在控制檯中觸發:@「警告:試圖提出在已經呈現(空)3dtouch嘗試呈現*上已*呈現(null)

回答

0

我經歷過同樣的問題,它的原因是你在cellForRowAtIndexPath登記表視圖細胞

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    // myTableViewCell is created or reused here 
    ... 
    registerForPreviewingWithDelegate(self, sourceView: myTableViewCell) 
    ... 

} 

。這會導致單元格被多次註冊,當它被表格視圖重新使用時。但是多次註冊相同的視圖registerForPreviewingWithDelegate不被允許,並導致您描述的警告和旋轉問題。

Apple documentation

您可以指定多個源查看單個註冊 視圖控制器,但你不能指定一個視圖作爲源 視圖不止一次。

解決方案很簡單。在第二次註冊之前檢查視圖是否已經註冊,如果需要取消註冊。

private var previewingContexts = [MyTableViewCellClass: UIViewControllerPreviewing]() 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    // myTableViewCell is created or reused here 
    ... 
    if let previewingContext = previewingContexts[myTableViewCell] { 
     unregisterForPreviewingWithContext(previewingContext) 
    } 

    let previewingContext = registerForPreviewingWithDelegate(self, sourceView: myTableViewCell) 
    previewingContexts[myTableViewCell] = previewingContext 
    ... 

} 

您也可以使用下面介紹的方法: http://krakendev.io/peek-pop/ 這將使用它傳遞給委託找出哪個電池拍了拍location參數。這樣你只需註冊整個表格視圖,而不是每個單元格。這可能是一個更好的解決方案。在我的情況下,這是不可能的,因爲我在tableview單元格內嵌套了集合視圖,所以它更復雜。

相關問題