2017-05-05 145 views
0

我正在使用外部委託文件來處理所有的UICollectionView的處理,我努力讓集合視圖單元格通過委託文件執行基於選定單元格的segue。Swift UICollectionView委託執行segue

這就是我目前擁有的委託文件中:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    let cell = collectionView.cellForItem(at: indexPath) 
    let mainController = MainController() 
    mainController.performSegue(withIdentifier: "detailSegue", sender: cell) 


} 

,並在主控制器我有:

override func performSegue(withIdentifier identifier: String, sender: Any?) { 
    if identifier == "detailSegue" { 
     let detailController = DetailController() 
     self.present(detailController, animated: true) 
    } 
} 

我得到的錯誤:

Warning: Attempt to present <DetailController: 0x7fbed8e6e4b0> on <MainController: 0x7fbedda79830> whose view is not in the window hierarchy! 

我想我可以通過委託調用參考,它會呈現控制器。

感謝

回答

1

MainController你參考下面試圖得到像是錯誤的。

let mainController = MainController() 

這不會給你的對象,而不是這一點,將創建MainController的新對象給你這不是在預覽層次的加載/預覽實例。所以你需要一個實際的預覽實例。

解決方案 在您委託類創建的UIViewController類型的一個全局對象,並通過你預覽類的引用,這樣,當你需要你可以使用它。

例子。

class DelegateDataSource: NSObject { 
    var viewController: UIViewController? 
    //Other Methods/Objects that you need. 
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    let cell = collectionView.cellForItem(at: indexPath) 
    if let mainController = viewController as? MainController { 
     mainController.performSegue(withIdentifier: "detailSegue", sender: cell) 
    } 



} 
} 

class MainController: UIViewController { 

    var delegateDataSource: DelegateDataSource? 
    func initializeDelegates() { 
     //Initialize you datasource object and do some tasks that you need and then assign your current instance to this class like this. 
     delegateDataSource.viewController = self 
    } 

} 
+0

工作,非常感謝。 – user7684436

+0

委託人應該弱,不要導致保留週期....'弱var viewController:UIViewController?'也最好通過使用協議解耦代碼 – Luzo

0
let mainController = MainController() 
mainController.performSegue(withIdentifier: "detailSegue", sender: cell) 

這是行不通的,無論是使用委託模式,或使用Singleton模式,爲您MainController。

-1

只有已經存在的控制器才能顯示另一個控制器。該班是否實施didSelectItemAt a UIViewController?如果是這樣,爲什麼不只是這樣做:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    let cell = collectionView.cellForItem(at: indexPath) 
    performSegue(withIdentifier: "detailSegue", sender: cell) 
}