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