2011-03-03 226 views
1

我有一個UIView的子類,可以從各種筆尖初始化。有沒有什麼辦法可以從我的UIView類中訪問它初始化的筆尖呢?有沒有辦法告訴我的UIView從哪個nib醒來?

正如您在下面看到的,目前我設置了標籤,然後能夠從我的課程中檢查該值,但我只是好奇UIViews是否意識到它們連接的是哪個筆尖,或者如果有是通過解碼器訪問它的某種方式。馬哈洛,如果有人知道。

NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:viewNibName owner:self options:nil]; 
self.viewInstance = (ViewClass *)[nibViews objectAtIndex:0]; 
self.viewInstance.tag = VIEW_INSTANCE_ID; 

回答

3

我不相信目前有一個好的方法來找出它是從哪個nib加載。記住:任何實現NSCoding的對象都可以存儲在一個nib文件中,而不僅僅是視圖。如果有辦法找出,它可能是通過調用NSKeyedArchiver或NSCoder中的方法,並且我沒有看到任何東西。

如果你真的認爲你需要這種能力,我建議定義的協議中包含的方法「 - (的NSString *)nibName」,並在你的類時裝載筆尖實現它。然後,您可以將您的視圖連接到「文件的所有者」的代理在筆尖圖標,它可以查詢筆尖業主爲筆尖的名稱。 UIViewController已經有了-nibName和-nibBundle方法,所以在大多數情況下這隻需要很少的工作。

這就是說,我不會推薦做這樣的事情。如果你有一個視圖類的行爲有所不同,取決於加載它的nib,我會把它看作是一個強烈的信號,你的代碼應該被重新考慮。我要麼將依賴於nib名稱的代碼移動到控制器類,要麼將代碼拆分爲兩個或多個單獨的視圖類。

1

爲什麼不直接繼承UIViewController(以其主視圖)而不是UIView ...? UIViewControllers有2個屬性:「nibName」和「nibBundle」,可以做你在問什麼...

+0

我同時加入了許多這些視圖對象到屏幕並推斷它會更輕巧,只需使用UIView如果我能擺脫它。 – 2011-03-04 16:52:45

0

這將做到這一點:

private var nibNameAssociationKey: UInt8 = 0 

extension UIView { 

    var nibName: String { 
     get { 
      return objc_getAssociatedObject(self, &nibNameAssociationKey) as String 
     } 
     set(newValue) { 
      objc_setAssociatedObject(self, &nibNameAssociationKey, newValue, UInt(OBJC_ASSOCIATION_RETAIN)) 
     } 
    } 

    class func loadFromNibNamed(nibNamed: String, bundle : NSBundle? = nil) -> UIView? { 
     var view = UINib(nibName: nibNamed, bundle: bundle).instantiateWithOwner(nil, options: nil)[0] as? UIView 
     view?.nibName = nibNamed 
     return view 
    } 
} 

用法:

var someView = SomeView.loadFromNibNamed("SomeSubviewOfSomeView") as SomeView? 
... 
var myNibName = someView!.nibName // will be "SomeSubviewOfSomeView" 
相關問題