public static bool LoadNibResourceNamedOwner(this NSBundle bundle, Type type, NSString resourceName, Id owner) { bool result = false; Assembly assembly = type.Assembly; using (Stream stream = assembly.GetManifestResourceStream(resourceName)) { if (stream != null) { byte[] buffer = new byte[stream.Length]; stream.Read(buffer, 0, (int)stream.Length); stream.Close(); String fileName = Path.GetTempFileName(); File.WriteAllBytes(fileName, buffer); NSNib nib = new NSNib(NSURL.URLWithString(fileName)); NSArray topLevelObjects; result = nib.InstantiateNibWithOwnerTopLevelObjects(owner, out topLevelObjects); nib.Release(); File.Delete(fileName); } } return result; }
public static bool InstantiateNibWithOwnerTopLevelObjects (Type type, NSString resourceName, Id owner) { if (resourceName == null) { throw new ArgumentNullException("resourceName"); } Assembly assembly = type.Assembly; Logger.Info("NSNib", "Searching for '" + resourceName + "' resource in " + assembly.FullName); // Lookup the resource name IEnumerable<String> resources = assembly.GetManifestResourceNames ().Where(r => r.StartsWith(resourceName)); if (resources.Count() == 0) { return false; } foreach(String r in resources) { Logger.Info("NSNib", "Found '" + r + "'"); } IList<String> candidates = new List<String> (); // Check the invariant culture String key = resourceName; Logger.Info("NSNib", "Probing '" + key + "'..."); String candidate = resources.FirstOrDefault (r => String.Equals (r, key)); if (candidate != null) { candidates.Add (candidate); } // Check preferred cultures NSArray languages = NSLocale.PreferredLanguages; foreach(NSString language in languages.GetEnumerator<NSString>()) { key = resourceName + "." + language; Logger.Info("NSNib", "Probing '" + key + "'..."); candidate = resources.FirstOrDefault (r => String.Equals (r, key)); if (candidate != null) { candidates.Add (candidate); } } if (candidates.Count == 0) { return false; } bool result = false; String name = candidates.First(); String fileName = Path.Combine (Path.GetTempPath (), Path.GetTempFileName ()); using (Stream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write)) { using (Stream resourceStream = assembly.GetManifestResourceStream(name)) { resourceStream.CopyTo (fileStream); } } NSNib nib = new NSNib (NSURL.FileURLWithPath (fileName)); NSArray topLevelObjects; #if MACOSX_10_8 result = nib.InstantiateWithOwnerTopLevelObjects(owner, out topLevelObjects); #else result = nib.InstantiateNibWithOwnerTopLevelObjects (owner, out topLevelObjects); #endif nib.Release (); File.Delete (fileName); return result; }