2017-03-28 21 views
1

所以我有一個主要的iOS應用程序,其中包括我所做的框架。從主應用程序,框架如何獲得自己的包? (Localizable.strings)

在這個框架中,我創建了一個Localizable助手以及一個Date助手。 日期助手有一個功能timeAgo(),它可以返回「8小時前」。我想本地化這個字符串。所以,我在我的框架是這樣的:

public extension String {  
    public func localized(in bundle: Bundle) -> String { 
     if let path = bundle.path(forResource: Localize.currentLanguage(), ofType: "lproj"), 
      let bundle = Bundle(path: path) { 
      return bundle.localizedString(forKey: self, value: nil, table: nil) 
     } 
     return self 
    } 
} 

public extension Date { 
    public func timeAgo(format: DateUnitFormat = .short) -> String { 
     let thisFrameworkBundle = Bundle(for: Localize.self) // Class declared in the framework 
     //Whatever, just display a localized word 
     return "second".localized(in: thisFrameworkBundle) 
    } 
} 

當我運行(框架本身內部的單元測試)本地測試,本地化的工作的事情。該包被找到。

但是,當我從我的主應用程序調用timeAgo時,它不再工作。

我試圖將let thisFrameworkBundle = Bundle(for: Localize.self)這行改爲let thisFrameworkBundle = Bundle(identifier: "com.myIdentifier"),同樣的事情(所以它在框架內工作,但在主應用程序調用時不起作用)。

編輯:

好了,所以我注意到,因爲我使用的CocoaPods Bundle(identifier: "com.myIdentifier")不會框架內的工作,它覆蓋了cocoapod一個框架標識符。然而,我仍然不明白爲什麼使用Bundle(for: FrameworkClass.self)將無法​​從主應用程序工作(但在框架的單元測試工作)

+0

添加評論給我建議的答案是「com.myIdentifier」完全合格嗎?如果是這樣,我很快就會刪除我的答案(和這個評論) - 但請看看我必須使用的用法。這可能是你需要的。 – dfd

回答

0

在這一刻,我可以給你兩種方式。對於過去的一年我一直在使用這樣的:

public func returnImage(_ named:String) -> UIImage { 
    let myBundle = Bundle.init(identifier: "com.[company].[framework]") 
    let imagePath = (myBundle?.path(forResource: "images", ofType: "bundle"))! + "/" + named 
    let theImage = UIImage(contentsOfFile: imagePath) 
    return theImage! 
} 

關鍵片追平了myBundle變量的捆綁ID定義項目。

我訂閱了一個名爲UseYourLoaf的博客。非常非常好的資源。今天他們的post,包含一個非常不同的方式來獲得這個 - 使用類和bundleForClass。我只是發表評論,要求我們的方法之間有利/弊。

我可以告訴你的是,如果你命名一個BundleID,你可以使用我的例程來獲取資源。

+0

我已經更新了我的答案。是的,我有正確的標識符。即使它不幫助我,你也應該留下你的答案。它可能會幫助其他人:) – Kalzem

相關問題