Nie można załadować NIB w pakiecie


111

Próbuję zintegrować Janrain Engage jako moduł niestandardowy z Appcelerator Titanium. Utworzyłem przykładowy moduł i przeciągnąłem folder JREngage do przykładowego modułu xcodeproj, jak wskazano w dokumentacji Jainrain.

Teraz daję polecenie kompilacji do tego projektu, następnie wykonuję, ./build.pya na koniec wykonuję titanium runpolecenie. Uruchamia aplikację w symulatorze z pustym ekranem i natychmiast zawiesza się, generując następujący błąd.

Zakończenie aplikacji z powodu nieprzechwyconego wyjątku „NSInternalInconsistencyException”, przyczyna: „Nie można załadować NIB w pakiecie:„ NSBundle </ Users / abhilash / Library / Application Support / iPhone Simulator / 4.2 / Applications / CA167346-4091-4E16-B841-955D1D391713 / test.app> (załadowano) 'o nazwie' JRProvidersController ''

Dlaczego ten błąd mógł wystąpić?

Odpowiedzi:


213

Odwiedź właściwości plików .xib w inspektorze plików , właściwość „Docelowe członkostwo” w polu wyboru, a następnie Twój plik xib został połączony z celem


2
Dodatkowo, jeśli używasz alokacji init, zamiast initWithNibName: bunle:, otrzymasz czarny ekran.
Robert Childan

Zastanawiasz się, dlaczego absolutnie nieużywany plik .xib musi wisieć w folderze plików projektu…
Ben,

Chyba przypadkowo odznaczyłem to pole wyboru zamiast automatycznego układu.
Naprawiłem

wszystkie pola wyboru członkostwa docelowego są dla mnie wyszarzone ... co może być tego przyczyną?
Staś

64

W Targets -> Build Phases

Upewnij się, że plik .xib został dodany Copy Bundle Resources, jeśli go nie ma, dodaj plik .xib.


Pracował dla mnie. Dzieje się tak zwykle podczas kopiowania / duplikowania pliku xib. +1
VoidMain

22

spróbuj dowiedzieć się wszystkiego

XXXController = [[XXXControlloer alloc] initWithNibName:@"XXXController" bundle:nil];

w swoim kodzie i upewnij się, że XXXControllersą wpisane poprawnie


to łatwe, ponieważ nibname nie jest
autotypem

1
Miał na myśli nazwę klasy tuż przed alokacją, która jest autotypem: P
Gil Sand.

uiview można załadować ze stalówki, ale nie ma initWithNibName:bundle:metody
Vyachaslav Gerchicov

mówimy o
kontrolerze

@ chings228 XXXControlloer i XXXController, zobacz różnicę
Zaporozhchenko Oleksandr

15

Miałem ten sam problem (wyjątek „Nie można załadować NIB w pakiecie: ..”) po uaktualnieniu mojego xcode z 3.2 do 4.02. Podczas gdy wdrożenie mojej aplikacji z Xcode 3.2 działało dobrze, wywala się, a xcode 4 podnosi wyjątek wspomniany powyżej - ale tylko wtedy, gdy próbowałem wdrożyć w symulatorze IOS (v.4.2). Kierowanie na urządzenie IOS (v.4.1) działało również z Xcode 4.

Okazało się (po wielu godzinach desperackiego szperania), że przyczyną było prawie „ukryte” ustawienie w pliku .xib:

Odwiedź właściwości plików .xib w inspektorze plików: Właściwość „Lokalizacja” została ustawiona na „Względem grupy” dla wszystkich plików .xib. Zmieniłem to na „Względem projektu” i voila: wszystkie pliki .xib są teraz poprawnie ładowane w symulatorze IOS!

Nie mam pojęcia, jaki jest powód tego dziwnego zachowania Xcode4, ale może warto spróbować?


To rozwiązało awarię, z którą miałem do czynienia podczas kompilowania bardzo przestarzałej wtyczki Quartz Composer.
Peter Kazazes

12

W moim przypadku było to bardzo dziwne (użyj storyboardu): Z jakiegoś powodu zmieniło się z "Nazwa bazowa pliku głównego storyboardu" na "Nazwa bazowa pliku głównego nib" w plist.

Zmiana z powrotem na „nazwę bazową pliku głównego storyboardu” (UIMainStoryboardFile) rozwiązała problem


1
Dobry. Miałem ten sam problem. Dzięki. To rozwiązało problem.
Rameez Hussain

1
To rozwiązało mój problem! Dziękuję Ci. Właśnie zduplikowałem swój projekt i zmieniłem nazwy wszystkich odpowiednich plików. Wszystko działało oprócz tego. Teraz wszystko działa !!
BeccaP

11

błąd oznacza, że ​​nie ma pliku .xib o "JRProvidersController"nazwie. sprawdź ponownie, czyJRProvidersController.xib istnieje.

można załadować .xib filez

controller = [[JRProvidersController alloc] initWithNibName:@"JRProvidersController" bundle:nil];

1
Hej Hanuman, sprawdziłem, że plik JRProvidersController.xib istnieje. Próbowałem również zmienić nazwę pliku i wykonać, nawet wtedy rzuca ten sam wyjątek.
Goje87,

spróbuj zmienić wywołanie na initWithNibName: NSStringFromClass ([klasa MyViewController]). Sprawdź również uważnie nazwę pliku, ponieważ jest rozróżniana wielkość liter
Hanuman


Wprowadziłem sugerowane przez Ciebie zmiany, ale nie odniosłem sukcesu.
Goje87,

7

Używając niestandardowego widoku Swift w kontrolerze widoku Objective-C (tak, nawet po zaimportowaniu <<PROJECT NAME>>-Swift.hpliku), próbowałem załadować końcówkę za pomocą:

MyCustomView *customView = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([MyCustomView class]) owner:self options:nil] objectAtIndex:0];

... ale NSStringFromClass([MyCustomView class])wraca <<PROJECT NAME>>.MyCustomViewi ładowanie kończy się niepowodzeniem. TL; DR Wszystko działało dobrze podczas ładowania stalówki przy użyciu literału ciągu:

MyCustomView *customView = [[[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil] objectAtIndex:0];

6

Ponieważ celem kompilacji było jedno z moich urządzeń z systemem iOS, kliknąłem prawym przyciskiem myszy plik produktu (xyzw.app) i wybrałem wyskakujący element Pokaż w Finderze. Otworzył okno z plikiem xyzw.app w środku; Otworzyłem paczkę za pomocą opcji Pokaż zawartość pakietu i zobaczyłem wszystkie pliki, których się spodziewałem, z wyjątkiem jednego pliku, na który narzekał, z dużą literą I zamiast małej litery i w nazwie (zoomieVIew.nib zamiast zoomieView.nib ). Zauważyłem wielką literę I w nazwie pliku xib, zmieniłem go i odbudowałem; najwyraźniej Xcode pozostawił wygenerowaną nazwę .nib taką, jaka była. Usunąłem zoomieVIew.nib w pakiecie, odbudowałem i Xcode należycie odtworzyłem plik jako zoomieView.nib. Aplikacja zaczęła działać na urządzeniu.


to samo, co opisuje Michael. utworzyłem plik xib zawierający niestandardowy UITableViewCell. kiedy otwieram .app i wyszukuję myCell.xib, widzę, że to faktycznie myCell.nib. Co więcej, aplikacja tylko zawieszała się na urządzeniu i ładowała plik xib poprawnie podczas wykonywania na symulatorze. resetowanie go było trochę trudne. przynajmniej dla mnie. tylko wtedy, gdy usunąłem plik, wyczyściłem cel i skopiowałem plik z powrotem - zadziałało.
Nir Pengas

oznaczone, ponieważ pokazuje również łatwy sposób na znalezienie i przeglądanie zawartości opakowania
fotisgpap

doh. jak mogłem się do tego znowu dostać. dzięki miły człowieku :) Byłem na samym początku badania tego problemu
szesnastkowo

6

Miałem ten problem z storyboardem i stalówka została nazwana czymś w rodzaju „bKD-J3-fhr-view-ZSR-8m-2da”.

Było tak, ponieważ próbowałem dodać podwidok do self.view w init kontrolera widoku (za pomocą Codera). Widok siebie jeszcze nie istnieje.

Przeniesiono go, aby wyświetlićDidLoad i wszystko lepiej!


Podobnie, wystąpił taki błąd, gdy (głupio) próbowałem przypisać delegata widoku tabeli i źródło danych w init () zamiast
viewDidLoad

5

Obejrzyj projekt

Target -> Buid Phases -> Copy Bundle Resources

Znajdziesz swój xib / storyborad w kolorze czerwonym.

Po prostu go usuń, a także wszystkie odniesienia do brakującego pliku z projektu.

Teraz ponownie przeciągnij ten plik storyboardu / xib do tego Copy Bundle Resources. Nadal będzie wyświetlać plik w kolorze czerwonym, ale nie martw się o to.

Po prostu wyczyść i zbuduj projekt.

Teraz Twój projekt będzie znowu działał pomyślnie !!


1
To rozwiązało mój problem, ponieważ mam dwa storyboardy „MyStoryboard.storyboard” i „MyStoryboard ~ ipad.storyboad” ... więc z docelowego iPada usunąłem „MyStoryboard.storyboard” z „Kopiuj zasoby pakietu”
i89

5

Dla Storyboard

Wypróbowałem każde opublikowane tutaj rozwiązanie, ale nic nie działało, ponieważ używam Storyboard with Swift 5.

Właśnie zacząłem budować nowe kontrolery i widoki w aplikacji testowej scenorysu, stwierdziłem, że brakuje mi identyfikatora Storyboard My View Controller.

Oto moje rozwiązanie, jeśli chcesz przejść z ViewController A -> View Controller B

Krok 1. W scenorysie: Upewnij się, że ViewControllerA jest osadzony w kontrolerze nawigacji

Krok 2. W scenorysie: Teraz sprawdź , czy wspomniałeś o identyfikatorze scenorysu dla swojego ViewControllerB, którego użyjesz w kodzie jako identyfikatora.

wprowadź opis obrazu tutaj

Krok 3. i na koniec upewnij się, że wciskasz kontroler w ten sposób w swoim ViewControllerA za pomocą przycisku.

if let viewControllerB = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewControllerB") as? ViewControllerB {

            if let navigator = navigationController {
                navigator.pushViewController(viewControllerB, animated: true)
            }
        }

4

NIE WKŁADAJ .xib PODCZAS WSTAWIANIA NAZWY XIB! JUŻ JUŻ DOROZUMIANE!

Nie rób tego:

 UIView *viewFromNib = [[NSBundle mainBundle] loadNibNamed:@"ResultsAssessmentView.xib" owner:self options:nil][0];

Zrób to:

 UIView *viewFromNib = [[NSBundle mainBundle] loadNibNamed:@"ResultsAssessmentView" owner:self options:nil][0];

4

Przykład Swift4, jeśli Twoje MyCustomView.swift i MyCustomView.xib w frameworku. Umieść to w init MyCustomView :

let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "MyCustomView", bundle: bundle)
if let nibView = nib.instantiate(withOwner: self, options: nil).first as? UIView {
    self.aViewInMyCustomView = nibView
    self.aViewInMyCustomView.frame = self.frame
    self.addSubview(self.aViewInMyCustomView)
    // set constraints
    self.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint(item: self.aViewInMyCustomView, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true
    NSLayoutConstraint(item: self.aViewInMyCustomView, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true
    NSLayoutConstraint(item: self.aViewInMyCustomView, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 0).isActive = true
    NSLayoutConstraint(item: self.aViewInMyCustomView, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1.0, constant: 0).isActive = true
} 

Wreszcie! Pracuję w modułowym projekcie iOS i tego właśnie szukam. Dziękuję Ci!
Firda Sahidi

co to jest aViewInMyCustomView?
famfamfam

@famfamfam: a UIView
norbDEV

tks, teraz wiem, jak używać
famfamfam

3

Zauważyłem również, że nie powiodło się, gdy próbowałem załadować XIB o nazwie takiej jak @ „MyFile.xib”. Kiedy właśnie użyłem @ "MyFile", zadziałało - najwyraźniej zawsze dodaje rozszerzenie. Ale komunikat o błędzie informował właśnie, że nie można znaleźć MyFIle.xib w pakiecie - gdyby był napisany MyFile.xib.xib, byłaby to duża wskazówka.


Powodem, dla którego nie możesz dodawać rozszerzenia, jest to, że w skompilowanym pakiecie pliki .xib są również kompilowane do plików .nib. Więc tak naprawdę w twoim pakiecie nie było MyFile.xib, nieważne podwójne rozszerzenie.
Pieter Jongsma

2

Pracując na Xcode 4.6.3 i lokalizując moje pliki NIB, również napotykam ten problem.

Dla mnie nic innego nie pomogło poza zmianą "Wersjonowania dokumentów" w File Inspector na Deployment 5.0 zamiast 6.1.


2

Dzieje się tak, gdy zmienisz nazwę pliku nib. Jeśli masz już końcówkę, utwórz nową końcówkę (czyli skopiuj zawartość bieżącego pliku końcówki do nowej końcówki), usuń stary plik końcówki, a to rozwiąże problem.

Edycja: Z nową wersją Xcode od 4.6.3, jeśli zmienisz nazwę (z funkcją refaktoryzacji) klasy kontrolera, zmieni się również nazwa pliku nib i nie musisz się martwić o problem z ładowaniem końcówki.


2

Właśnie miałem ciekawe doświadczenie z Xcode 6.3.

Ciągle otrzymywałem ten błąd, mimo że próbowałem wszystkiego, o czym normalnie pomyślałeś, z pisownią, członkostwem docelowym itp., Jak zasugerowano powyżej. Próbowałem również kilkakrotnie wyczyścić, usunąć dane pochodne, a także usunąć aplikację z symulatora, aby upewnić się, że pakiet został poprawnie zbudowany, ale bezskutecznie.

Wreszcie, podążając za odpowiedzią Briana Michaela Bentleya, w końcu zdecydowałem się sprawdzić mój plik .app w folderze mojego symulatora na moim HD. Okazało się, że były tam wszystkie moje stalówki, ale z abc ~ ipad.nib zamiast oczekiwanego abc.nib. Ręcznie zmieniłem nazwy wszystkich tych plików, aby usunąć część ~ ipad, zbudowałem i zadziałało!

Próbując zobaczyć, dlaczego zostały one dodane ze słowem kluczowym ~ ipad, przyjrzałem się ustawieniom projektu i faktycznie, na karcie Ogólne> Informacje o wdrożeniu wybrałem tylko iPada. Próbowałem uruchomić na symulatorze iPhone'a. Uważam, że w przeszłości Xcode dawał błąd wskazujący, że plik binarny nie obsługuje iPhone'a i nie udałoby się uruchomić aplikacji.

Usunąłem aplikację z symulatora i ponownie zrobiłem to samo - znowu z obsługą tylko iPada. Tym razem .app zawierał abc ~ iphone.nib ORAZ abc ~ ipad.nib dla każdego oczekiwanego storyboardu i działał dobrze na symulatorze iPhone'a. Ponownie - jeśli wybierzemy iPada tylko w naszych ustawieniach informacji o wdrożeniu, nie powinien on działać na iPhone Simulator. To jest błąd Xcode.

Tak więc występuje tutaj niespójne zachowanie ze strony Xcode i niestety jest to błąd sporadyczny i może to być trudne do odtworzenia, ale umieściłem to tutaj, aby pomóc innym w przyszłości.


2

Gdyby ten sam problem nie działał, doszedłem do czegoś dziwnego z danymi pochodnymi.

W xcode 6.3.2 musiałem:

W menu XCode -> Preferencje -> zakładka Lokalizacje -> W lokalizacjach Zmień pochodne dane na względne, a następnie przełącz z powrotem na domyślne

Następnie stalówka załadowana dobrze.


Właśnie usunąłem folder Derived Data i zadziałało. Wydaje się być zdezorientowany, ponieważ zmieniłem nazwę pliku xib w nawigacji projektu. Dziwny.
Kyle Goslan

2

Twój plik XIB prawdopodobnie znajduje się poza folderem projektu. Prowadzi to do niewyświetlania docelowego Inspektora. Jednak przeniesienie pliku XIB do folderu projektu powinno rozwiązać ten problem.


2

Uważaj: Xcode rozróżnia wielkość liter w nazwach plików. To nie ta sama „zabawa”, co „zabawa”.


Nazwa pliku dla mojej końcówki to FormItemCheckBoxCell.nib, klasa to FormItemCheckboxCell. Kapitalizacja „Box” w nazwie kosztowała 45 minut mojego życia.
SafeFastExpressive

1

Jeśli używasz frameworków w swoim projekcie, musisz upewnić się, że ładujesz z odpowiedniego pakietu:

NSBundle *bundle = [NSBundle bundleWithIdentifier:@"<your bundle id here>"];
ABCViewController *vc = [[ABCViewController alloc] initWithNibName:@"<your nib name>" bundle:bundle];

1

dla mnie rozwiązało to po prostu zmieniając nazwę pliku mojej komórki na taką samą, jak jej klasa.

W Inspektorze atrybutów (trzecia zakładka na prawym pasku bocznym w scenorysie):

  1. Ustaw identyfikator komórki (na przykład: „MyCellId”),
  2. Ustaw klasę komórki (na przykład: „MyCellClass”, gdy plik to „MyCellClass”),
  3. Zarejestruj komórkę w kontrolerze widoku w następujący sposób:

    tableView.register (UINib (nibName: "MyCellClass", bundle: nil), forCellReuseIdentifier: "MyCellId")


0

Mam ten problem podczas przekształcania mojego starego kodu z XCode 3x na XCode 4 i rozwiązałem go, zmieniając nazwę wwwwwwww.xib na RootViewController.xib


0

Napotkałem ten sam problem. W moim przypadku końcówka nosiła nazwę „MyViewController.xib” i zmieniłem jej nazwę na „MyView.xib”. Pozwoliło to wyeliminować błąd.

Przenosiłem też projekt z XCode 3 na 4.2. Zmiana typu ścieżki nie miała znaczenia.


0

Przyczyną może być również to, że plik jest wyszukiwany w folderze określonego języka, gdy pomieszałeś z lokalizacjami.


0

Za każdym razem, gdy refaktoryzuję nazwę kontrolera widoku, która jest w mojej aplikacjiDelegate, tracę na to czas. Refaktoryzacja nie zmienia nazwy końcówki w initWithNibName: @ "MYOldViewControllerName".


0

Miałem ten sam problem, zmiana nazwy mojego identyfikatora kontrolera widoku w scenorysie działała dla mnie.


0

Zauważyłem, że może się to zdarzyć, jeśli przełączysz się między gałęziami w git i zapomnisz wyczyścić. Więc xib jest tam i wszystko jest znalezione, ale dokładna kompilacja może mieć problemy. Więc na wszelki wypadek nie zapomnij wyczyścić


0
SecondViewController *secondViewController = [[SecondViewController alloc]initWithNibName:@"SecondView.xib" bundle:nil];
    [self.navigationController pushViewController:secondViewController animated:YES];

W powyższym kodzie, jeśli podasz również rozszerzenie pliku, takie jak „SecondView.xib”, oznacza to, że jest ono nieprawidłowe i wyświetli powyższy błąd. Zamiast tego użyj „SecondView”. Popełniłem ten błąd.


0

To działa dla mnie ... Upewnij się, że poprawnie wpisałeś nazwę stalówki.

[[NSBundle mainBundle] loadNibNamed: @ "Graphview" właściciel: opcje własne: nil];

Graphview (nazwa końcówki)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.