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.