我試圖在Swift中編寫一個小擴展來處理故事板中的UIViewController
的實例化。從故事板實例化的UIViewController擴展
我的想法是這樣的:由於UIStoryboard
的方法instantiateViewControllerWithIdentifier
需要一個標識符來實例化一個給定的故事板的視圖控制器,爲什麼不是每個視圖控制器在我的故事板的標識符等於其確切的類名(即UserDetailViewController
分配將有「UserDetailViewController」)的標識符,並創建一個的UIViewController類的方法,將:
- 接受
UIStoryboard
實例作爲唯一參數 - 獲取當前類的字符串名字
- 與類名作爲參數的故事板實例調用
instantiateViewControllerWithIdentifier
- 獲得新創建的
UIViewController
實例,並返回它
因此,而不是(其中重複類的字符串名字,不是很好)
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("UserDetailViewController") as UserDetailViewController
這將是:
let vc = UserDetailViewController.instantiateFromStoryboard(self.storyboard!)
我用的followi做在Objective-C ng類別:
+ (instancetype)instantiateFromStoryboard:(UIStoryboard *)storyboard
{
return [storyboard instantiateViewControllerWithIdentifier:NSStringFromClass([self class])];
}
但是我完全被Swift版困住了。我希望有某種方式可以做到這一點。 我試過如下:
extension UIViewController {
class func instantiateFromStoryboard(storyboard: UIStoryboard) -> Self {
return storyboard.instantiateViewControllerWithIdentifier(NSStringFromClass(Self))
}
}
返回Self
代替AnyObject
允許類型推斷工作。否則,我將不得不施放這種方法的每一次返回,這很煩人,但也許你有更好的解決方案?
這給了我錯誤:Use of unresolved identifier 'Self'
NSStringFromClass
部分似乎是問題所在。
您認爲如何?
有沒有什麼辦法從類函數中返回
Self
?如何在不需要每次都施加返回值的情況下得到此工作? (即保留
-> Self
作爲返回值)
謝謝。
我可以看到該實用程序,但意識到這個「解決方案」排除了在給定故事板中具有相同視圖控制器類的兩個實例。 – Caleb 2014-09-29 15:30:07
當然,但這是已知在我的應用程序中是不可能的(因爲慣例是固定的)。我確保故事板中的兩個視圖控制器不能具有相同的類名稱。 – 2014-10-01 07:30:57
回聲@Caleb,這可能是一個壞主意。你正在施加一個不必要的約束,只有很少的好處。從長遠來看,公約並不是特別可靠。 – mattt 2014-10-02 02:15:30