在iOS開發中, 要實現UIViewController之間的跳轉,通過navigationController的pushViewController或者UIViewController自身的presentViewController的方式即可。但要求是從一個UIViewController跳到另外一個UIViewController中。如果要從NSObject子類的執行代碼中做跳轉至UIViewController的操作, 要如何實現呢?
首先, 說明下為何會有這樣的需求, 即: UICollectionView -> NSObjectSubclass -> UIViewController:
設置UICollectionView的datasource和delegate為一個NSObject的子類, 用於處理所有跟UICollectionView的datasource和delegate相關的邏輯關系. 那麼在該類的執行代碼中可能有調轉到另一個UIViewController的使用場景. 此時, 不能使用pushViewController, 因self根本就沒有navigationController屬性;也不能使用presentViewController, self不是UIViewController的子類。
解決方式可以考慮一下兩種:
delegate是iOS中非常常見的方法. 設置UICollectionView的xxxDelegate為該NSObjectSubclass, 實現其中的方法xxxDelegateMethod1, 然後在NSObjectSubclass的執行代碼中調用xxxDelegate的xxxDelegateMethod1方法. 該方法的實現在UICollectionView(包含navigationController屬性)中, 因此在其中可以實現UIViewController之間的正常跳轉.
在NSObjectSubclass的執行代碼中, 先獲取當前的rootViewController, 在做UIViewController之間的跳轉:
UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];
[rootViewController presentViewController:filterCourseViewController animated:NO completion:nil];
最終, 要實現UIViewController之間的跳轉, pushViewController或presentViewController的執行代碼所處的類self必須要有navigationController屬性, 或者必須是UIViewController的子類.