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;
}
}