Die Prüfung, ob eine .nib oder .xib-Datei existiert
Was ist der beste Weg, um zu überprüfen, ob eine Feder oder Xib-Datei existiert, bevor Sie versuchen, laden Sie es mit initWithNibName:bundle:
oder ähnliches?
- Warum würde die Spitze fehlen? Vor allem in einer iPhone-app; es ist nicht, wie der Nutzer kann wollen, um Chaos in Ihrem Antrag unterschrieben bundle. (Vielleicht auf jailbreak, aber selbst dann, sollte der Benutzer erwarten, dass Zerbrochenheit, wenn Sie gehen, löschen Dinge aus innerhalb von apps.)
- Sie sind quire Recht. Ich habe eine Recht komplexe interface-Hierarchie und einige der nib sind noch nicht abgeschlossen. Ich wollte zu 'fangen' nicht gefunden und eine Meldung "Nicht Implementiert" - Alarm, das bedeutet, ich kann senden demos und kein crash-simulator, wenn ich auf der falschen Taste.
- Wie wäre es, wenn die Gestaltung eine Bibliothek/framework? Sie weiß nicht, was ist und ist nicht im Lieferumfang enthalten in Ihrem Benutzer-app. Besser setzen Sie ein Häkchen drin.
- Warum wäre jeder der Bibliothek - /framework-Geschäft?
- So kann man würdevoll einen Fehler zurückgeben oder eine exception werfen, statt einfach nur Absturz der app...
- Das ist nicht das, was ich zu Fragen. Warum ist die Bibliothek/framework selbst versuchen, eine nib/storyboard aus der app in den ersten Platz?
- Jemand könnte eine Bibliothek, die es einfacher machen, die Verwendung verschiedener Federn/storyboards... Warum sollte ich Gründen? Ich habe nie gesagt, es ist eine nützliche Sache zu tun, nur dass die Möglichkeit besteht, jeez.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Makro
Hier sind eine Reihe von Makros, die Sie anrufen können, bevor Sie versuchen, laden Sie ein
.xib
oder.nib
Sie helfen dabei, die fehlenden Dateien und spuckte brauchbare Fehlermeldung, was genau fehlt.Lösungen
Objective-C:
Bitte beachten Sie, dass die Dokumentation besagt, dass
ofType:
sollte die Erweiterung der Datei. Aber auch wenn Sie verwenden .xib-Sie müssen pass `@"Feder" oder es wird ein false-negative.Swift:
(Siehe: touti's original Antwort: https://stackoverflow.com/a/55919888/89035)
ofType:
ist tatsächlich korrekt, und das argument könnte die Erweiterung der Datei (Sie können tatsächlich setzen Sie den gesamten Dateinamen in derpathForResource:
und nil inofType:
und alles wird gut funktionieren, aber ich weiß nicht, ob es eine gute übung). Der Grund derxib
/nib
Unterschied ist, dass xib-Dateien sind eigentlich vorverarbeitet und verpackt, wie die Spitze der apppathForResource:ofType:
funktioniert wie angegeben 😉 (einfach zu überprüfen .app-Inhalte, wenn Sie mir nicht glauben)ofType:
parameter "storyboardc". Sieht aus wie ein Tippfehler, aber das ist die Erweiterung storyboards haben im bundle.Gibt es zwei Lösungen, die ich hier sehen.
Könnte man nur nennen initWithNibName:bundle: und fangen Sie eine Ausnahme, wenn es scheitert (ich mag diese Idee, es fühlt sich robust). Wahrscheinlich werden Sie wollen, stellen Sie sicher, dass Sie die Ausnahme ist in der Tat eine "Datei nicht gefunden" Ausnahme-eher als, sagen wir, ein "out of memory" exception.
Alternativ, Sie könnten überprüfen Sie die Existenz der Feder wird zuerst mit NSBundle ist pathForResource:ofType: gibt nil für Dateien, die nicht existieren.
initWithNibName:bundle:
nicht werfen eine exception, wenn die Datei nicht vorhanden, man bekommt nur Probleme, wenn Sie versuchen, verwenden Sie es mit so etwas wiepushViewController:animated:
initWithNibName:bundle:
scheint, um wieder eine gültige Objekt-auch wenn Sie es insgesamt Müll Namen.Lösung Für swift :