Nib yang dimuat tetapi outlet 'view' tidak disetel

742

Saya menambahkan file nib baru ke proyek saya, dan mencoba memuatnya.

Namun, ketika saya mengklik ikon bilah alat yang seharusnya membawa saya ke tampilan yang saya buat, saya menerima NSInternalInconsistencyExceptionpesan:

Mengakhiri aplikasi karena pengecualian 'NSInternalInconsistencyException' tanpa alasan, alasan: '- [UIViewController _loadViewFromNibNamed: bundel:] memuat nib "..." tetapi nib outlet view tidak disetel.'

Jadi saya membuka file nib saya, dan saya melihat bahwa tidak ada outlet referensi yang ditetapkan. Namun, saya mencoba mengklik dan menyeret lingkaran untuk "outlet referensi baru" ke Pemilik File, tetapi itu tidak akan membiarkan saya ... apa yang harus saya lakukan untuk membuat tampilan saya ditampilkan?

John
sumber
1
Coba bersihkan bangunannya terlebih dahulu.
LetynSOFT
Im kasus saya, kesalahan sebenarnya adalah bahwa saya mendefinisikan metode di viewController (- (void) setValue: (NSNumber *) nilai forKey: (NSString *) kunci) yang menimpa metode ViewController menyebabkan kesalahan. Saya memecahkan masalah penggantian nama metode ini
christian mini

Jawaban:

1807

Kalian benar, tetapi karena saya adalah seorang pendatang baru, saya butuh sedikit waktu untuk mengetahui semua langkah untuk melakukan itu. Inilah yang bekerja untuk saya:

  • Buka file XIB yang menyebabkan masalah
  • Klik pada ikon pemilik file pada bilah kiri (yang teratas, terlihat seperti kotak kuning yang diuraikan)
  • Jika Anda tidak melihat bilah sisi kanan, klik ikon ketiga di atas "tampilan" di bilah alat Anda. Ini akan menampilkan bilah sisi kanan
  • Di bilah sisi kanan, klik tab ketiga - tab yang sedikit mirip koran
  • Di bawah "Kelas Kustom" di bagian atas, pastikan Kelas adalah nama ViewController yang harus sesuai dengan tampilan ini. Jika tidak, masukkan
  • Di bilah sisi kanan, klik pada tab terakhir - yang terlihat seperti lingkaran dengan panah di dalamnya
  • Anda akan melihat "outlet" dengan "view" di bawahnya. Seret lingkaran di sebelahnya ke ikon "view" di bilah kiri (yang di bawah, terlihat seperti kotak putih dengan garis abu-abu tebal
  • Simpan xib dan jalankan kembali
Josh Justice
sumber
Saya menghadapi masalah ini pada kakao juga dan selama tampilan tidak dimuat / ditambahkan ke hierarki tampilan, semua outlet tampilan adalah NIL. Setelah memanggil addSubview atau yang serupa semua outlet terhubung. Bagian lucu dari cerita saya adalah po viewcontroller.view.subviews menunjukkan benda yang hilang.
APOC
11
Solusi ini tidak lagi berfungsi di Xcode 7.3 pada langkah 4 & 5. Sebaliknya, di pembuat antarmuka, tarik-seret dari pemilik File ke tampilan Anda.
PeiweiChen
2
Tidak berfungsi untuk saya (tidak ada bagian outlet di inspektur koneksi, jadi tidak ada "tampilan" di bawah outlet yang terhubung), tetapi +1 untuk upaya yang Anda lakukan dalam jawaban Anda. :)
William T. Mallard
2
Jika Anda tidak melihat "tampilan" di outlet, Anda juga dapat menyeret ctlr dari pemilik file ke tampilan di storyboard. Menu kontekstual akan muncul dengan opsi "view"
josef
1
@ WilliamT.Mallard Saya memiliki perilaku yang sama. MyViewControlleradalah subkelas dari subkelas UIViewControllerdan tidak ada di viewbawah "Outlet". Jika saya subkelas MyViewControllerlangsung dari UIViewControllertampilan muncul "Outlet". Sihir atau bug Xcode.
user2319066
201

Ini adalah proposal Josh Justice, tetapi dengan cara grafis (gambar adalah milikku):

  1. Pilih Pemilik file
  2. Di sebelah kanan panel pilih kelas khusus.
  3. Masukkan nama kelas khusus

masukkan deskripsi gambar di sini

  1. Di sebelah kanan panel pilih gulir
  2. Seret outlet tampilan untuk melihat komponen

masukkan deskripsi gambar di sini

Akhirnya View Controller dipakai dengan kode bergulir:

        PTFilterUserVC *aFilterUserVC = [[PTFilterUserVC alloc] initWithNibName:@"FilterVC" bundle:nil];

        //OPTIONAL.This is how 'I' am interested in present the view controller.
        [self.navigationController pushViewController:aFilterUserVC animated:YES];
Javier Calatrava Llavería
sumber
1
Terima kasih Javier Calatrava Llavería ... banyak membantu saya setelah memukul kepala saya selama satu jam !!!
BharathRao
un exito muchas gracias
Bruno Sosa Fast Tag
Saya melewatkan langkah ke 5
hamada147
73

Saya biasanya dapat memperbaikinya dengan membuat ulang koneksi antara Pemilik File dan tampilan. Seret kontrol dari pemilik File ke View Anda (dalam IB) dan pilih view dari menu pop-up.

Rohit Mandiwal
sumber
62

View Identity - Identitas Kelas tidak disetel. Setelah mengaturnya ke kelas yang sesuai, masalah terselesaikan.

John
sumber
Hai @ John, saya sudah melakukan ini tetapi masih mendapatkan pengecualian ini.
Mansuu ....
29

Apakah Anda yakin memiliki UIView (atau subclass) yang ditugaskan ke properti "view" yourViewController?

Klik kanan pada "Pemilik File" di panel kiri xib untuk yourViewController dan verifikasi bahwa outlet "view" telah diatur. Jika tidak, atur ke tampilan!

ini pasti akan memperbaiki Masalah

Shehbaz Khan
sumber
2
Jelas, jawaban singkat.
sark9012
15

Bagi saya semua hal yang dinyatakan di sini https://stackoverflow.com/a/6395750/939501 benar tetapi masih ada kesalahan melempar, alasannya saya membuat kelas View dengan nama ABCView dan kemudian menghapusnya kemudian saya menambahkan view controller sebagai ABCViewController jadi entah bagaimana itu merujuk ke ABCView lama di view controller baru, saya harus menghapus ABCViewController dan menambahkan yang baru dengan nama berbeda yang menyelesaikan masalah saya.

Terima kasih

vishal dharankar
sumber
Masih bug pada tahun 2020.
Tamás Sengel
15

Saya memiliki masalah yang sama dengan XCode 4.6.3. Saya sudah mulai dengan beberapa file yang dinamai MySettingsView.hdan .mtetapi dihapus mendukung MySettingsViewController.h, tetapi meskipun mencoba sebagian besar petunjuk yang disebutkan di sini, masih terus membuat kesalahan,

2013-07-05 11: 48: 17.205 MyApp [39024: c07] *** Mengakhiri aplikasi karena pengecualian 'NSInternalInconsistencyException', alasan: '- [UIViewController _loadViewFromNibNamed: bundel:] memuat nib "MySettingsView" tetapi saluran keluar tampilan tidak diatur. '

Itu jelas masih "bingung", mencoba memuat MySettingsView.xib bukan MySettingsView Controller .xib. Mungkin logika "lakukan apa yang saya maksudkan" terlalu mewah.

Jadi saya mengatasi masalah dengan meng-hardcoding nama NIB / XIB di MySettingsViewController.m:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:@"MySettingsViewController" bundle:nibBundleOrNil];
}
Nathan
sumber
10

Bagi siapa pun yang menggunakan metode xib untuk membuat UIView dan mengalami masalah ini, Anda akan melihat bahwa Anda tidak akan memiliki outlet "view" di bawah menu inspektur koneksi. Tetapi jika Anda mengatur kelas kustom Pemilik File ke UIViewController dan kemudian Anda akan melihat outlet "view", yang Anda dapat dengan mudah CMND menghubungkan outlet ke CustomView.

manapate
sumber
Luar biasa. Terima kasih banyak. Ini harus menjadi jawaban yang diterima!
Roman
7

Masalah saya dengan ini disebabkan oleh memiliki duplikat nib di folder kelas yang tidak memiliki set tampilan. xcode tampaknya memilih satu nib untuk membangun dan kemudian yang lain saat saya membangun proyek. Baru saja menghapus yang lain. Kelihatan bagus. Doh!

Mat
sumber
6

Hanya menghabiskan waktu lebih dari satu jam untuk mencari tahu mengapa properti tampilan saya tidak diatur di controller tampilan saya setelah memulai dari nib. Ingatlah untuk memanggil "[super initWithNibName ...]" di dalam initWithNibName pengontrol tampilan Anda.

Kamil.S
sumber
5

Saya baru saja memperbaiki ini di tambang saya. Proyek besar, dua file. Salah satunya adalah "ReallyLargeNameView" dan yang lainnya adalah "ReallyLargeNameViewController"

Berdasarkan jawaban ke-2 yang dipilih di atas, saya memutuskan untuk membersihkan bangunan saya. Nada, tapi saya masih curiga XCode (karena saya memiliki dua kelas yang identik, harus abstrak mereka tetapi eh ...) Jadi seseorang bekerja, satu tidak. Nama pemilik file sejauh disalin dan ditempelkan, outlet disusun ulang, xCode dinyalakan ulang, masih belum ada.

Jadi saya menghapus kelas bernama serupa (yang merupakan tampilan). Segera, kesalahan baru "outlet di dalam tidak terhubung" secara harfiah adalah "webView bukan nilai kunci" bla ... pada dasarnya mengatakan "Visual Studio lebih baik". Ngomong-ngomong ... Saya menghapus file bernama yang lebih kecil, dan bam, itu berhasil.

XCode dikacaukan oleh file dengan nama yang mirip. Dan proyek ini cukup besar sehingga perlu me-reboot sedikit, yang mungkin menjadi bagian darinya.

Seandainya saya punya jawaban yang lebih teknis daripada "XCode bingung", tapi yah, xCode banyak bingung pada saat ini. Tidak bingung dengan cara yang sama saya akan membantu anak kecil. Ini berfungsi sekarang, :) Harus menguntungkan orang lain jika hal di atas tidak memperbaiki apa pun.

Selalu ingat untuk membersihkan bangunan Anda (dengan menghapus simulator juga)

Stephen J
sumber
4

Saya juga memiliki masalah yang sama dan masalah saya adalah saya menambahkan lokalisasi lain (bahasa Inggris) ke nib ViewControllers sehingga aplikasi saya dengan Jerman lokalisasi tidak dapat menemukan nib dengan bahasa Inggris Lokalisasi !! Semoga ini bisa membantu siapa saja!

Weini
sumber
4

Saya telah menghadapi masalah yang sama ketika secara tidak sengaja menghapus referensi xib dan menambahkannya lagi. Saya baru saja memperbaikinya dengan membuat koneksi antara pemilik File dan tampilan. Juga pastikan bahwa kelas kustom FilesOwner Anda adalah viewController yang Anda harapkan.

Nidhin
sumber
3

Bagi saya, masalahnya disebabkan oleh panggilan initWithNibName:bundle:. Saya menggunakan sel tampilan tabel dari file nib untuk menentukan formulir entri yang diduduki tableViews. Karena saya tidak memiliki pandangan, tidak masuk akal untuk menghubungkan ke satu. Sebaliknya, jika saya memanggil initWithStyle:metode sebagai gantinya, dan dari dalam sana, saya memuat file nib, maka semuanya berjalan seperti yang diharapkan.

DaveDude
sumber
3

Jawaban sebelumnya hampir memecahkan masalah bagi saya, tetapi langkah terakhir hilang.

  1. Buat file xib dan cepat dengan nama yang sama.

Tambahkan Lihat dan Swift File

  1. Atur pemilik file menjadi subkelas UIView.

masukkan deskripsi gambar di sini

  1. Seret keluar dari Lihat ke subkelas UIView, beri nama "contentView"

tambahkan tampilan konten

  1. Tambahkan penginisialisasi khusus ini sehingga ketika xib memuatnya menempel contentView

tambahkan contentview sebagai subview

required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        Bundle(for: self.classForCoder).loadNibNamed("SampleView", owner: self, options: nil)
        addSubview(contentView)
        contentView.frame = self.bounds
        contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    }

Sekarang setiap @IBOutlets yang Anda tambahkan akan dilampirkan.

Cheers, Richard

BAKER COSMO
sumber
2

Saya memiliki masalah yang sama, tetapi solusi yang sedikit berbeda diperlukan. Masalah dalam kasus ini adalah kelas dari Pemilik File, bukan kelas Tampilan. Untuk mengatur ini, saya harus mengklik ikon "mundur bermain" di sudut kiri bawah jendela Interface Builder, dan kemudian muncul opsi yang mengisolasi karakteristik Pemilik File, Responder Pertama, dan Tampilan. Mengklik yang pertama (kotak transparan besar), memungkinkan saya untuk kemudian mengatur kelas kustom seperti yang disarankan di atas.

Michael Stern
sumber
2

Saya memiliki masalah yang sama, tetapi diperlukan solusi yang berbeda. Masalah dalam hal ini adalah kelas dari Pemilik File tidak terhubung ke file xib.

pengguna1951454
sumber
2

Saya bertemu dengan sesuatu yang sangat mirip malam ini, dengan subclass Swift UIViewController. Dalam hal ini, tidak ada perbaikan di atas yang berfungsi, tetapi menyusun ulang kode saya sedikit berhasil. Net-net, memiliki ekstensi ke subclass terjadi sebelum definisi subclass itu sendiri dalam file yang sama tampaknya membingungkan XCode, meskipun dikompilasi dengan baik; perbaikannya adalah menempatkan ekstensi setelah definisi subkelas.

Saya telah memposting detail dalam jawaban untuk pertanyaan serupa ini .

Cora Middleton
sumber
2

Dalam kasus saya, penginisialisasi yang ditunjuk - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNildi kelas *** ViewController dilaksanakan sehingga bahkan ketika saya memanggil penginisialisasi lain untuk menginisialisasi objek, penginisialisasi yang ditunjuk akan dipanggil.

Jadi untuk mengatasi masalah ini memeriksa apakah - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNilitu juga merupakan cara yang tepat.

lynulzy
sumber
2

Saya mengalami masalah ini dengan cara yang sedikit berbeda dari jawaban lain di sini.

Jika saya hanya membuat file xib baru, menambahkan UIViewController ke dalamnya di Interface Builder, dan mengatur kelas khusus UIViewController ke pengontrol tampilan saya, yang mengakibatkan crash "tampilan outlet tidak diset". Solusi lain di sini mengatakan untuk mengontrol-tarik keluar tampilan ke Lihat, tetapi bagi saya tampilan keluar diklik dan saya tidak bisa mengontrol-tarik.

outlet View berwarna abu-abu

Saya tahu bahwa kesalahan saya adalah menambahkan UIViewController di Interface Builder. Sebagai gantinya, saya harus menambahkan UIView, dan mengatur Kelas Kustom Pemilik File ke pengontrol tampilan saya. Kemudian saya bisa mengontrol-seret outlet tampilan dari Pemilik File ke tampilan baru saya UIView dan semuanya berfungsi sebagaimana mestinya.

Brian Kendig
sumber
1

Hanya memiliki kesalahan yang sama dalam proyek saya, tetapi alasannya berbeda. Dalam kasus saya, saya memiliki pengaturan IBOutlet dengan nama "Lihat" di kelas UITableViewController kustom saya. Saya tahu "view" itu istimewa karena itu adalah anggota kelas dasar, tetapi saya tidak berpikir View (kasus berbeda) juga akan menjadi masalah. Saya kira beberapa area Kakao tidak peka terhadap huruf besar-kecil, dan mungkin memuat xib adalah salah satu area tersebut. Jadi saya hanya menamainya menjadi DefaultView dan semuanya baik-baik saja sekarang.

Eselk
sumber
1

pilih pemilik file dan buka pembukuan identitas, beri nama kelas yang terkait. Jika tidak ada metode di atas yang berfungsi dan Anda masih tidak dapat melihat tampilan outlet, kemudian berikan koneksi outlet referensi baru ke Pemilik File maka Anda dapat dapat melihat tampilan outlet. Klik pada tampilan Outlet untuk membuat koneksi antara Lihat Outlet dan pemilik File. Jalankan Aplikasi ini berfungsi dengan baik.

Abhilash Reddy kallepu
sumber
1

Dalam kasus saya, tampilan tidak dilihat dalam xib. di xib, View adalah size = none (tab ke-4 kanan). Saya mengatur ukuran ke Freeform dan memuat ulang xCode. tampilan naik banding dan saya mengatur tautan yang tepat ke Tampilan.

OrdoDei
sumber
1

Jika Anda telah mencoba semuanya dan Anda masih mendapatkan kesalahan ini, cobalah membuat kembali file kelas dari awal tetapi ingat untuk memilih kotak centang "Juga buat file XIB". Ini akan secara otomatis menghubungkan beberapa item yang tidak ditautkan saat membuat file-file ini secara terpisah. Setelah ini dibuat, Anda mungkin dapat memotong dan menempelkan semuanya ke XIB baru dan itu akan berfungsi dengan baik.

Saya menemukan masalah ini secara khusus dengan membuat file secara terpisah di Swift.

Travis M.
sumber
1

bagi saya itu terjadi, kapan

  • Saya memiliki kelas ViewController (.mm / h) yang terkait dengan file Nib,
  • UIView dari ViewController ini harus dimuat pada tampilan lain sebagai subview,

  • kami akan memanggil sesuatu seperti ini

    -(void)initCheckView{
    
       CheckView *pCheckViewCtrl = [CheckView instance];
    
       pCheckView = [pCheckViewCtrl view];
    
       [[self view]addSubview:pCheckView];
    
       [pCheckViewCtrl performCheck];        
    
    }

Dimana

+(CheckView *)instance{
    static CheckView *pCheckView = nil;
    static dispatch_once_t checkToken;

    dispatch_once(&checkToken, ^{
        pCheckView = [[CheckView alloc]initWithNibName:@"CheckView" bundle:nil];
        if ( pCheckView){
            [pCheckView initLocal];
            **[pCheckView loadView];**
        }
    });

    return pCheckView;

}

Di sini loadView tidak ada ,,, menambahkan baris ini menyelesaikan masalah saya.

Amitg2k12
sumber
1

Saya memiliki masalah yang sama, saya menemukan dan itu karena saya telah menandai " sel statis " di properti Table View di bawah opsi Konten . Bekerja ketika diubah menjadi " Dynamic Prototypes". Tangkapan layar di bawah. masukkan deskripsi gambar di sini

Saranjith
sumber
1

Saya memiliki masalah yang sama dengan Xcode 9.3, dan pengaturan "Modul" di bawah atribut "Pemilik File" ke modul proyek memperbaiki ini untuk saya.

nananta
sumber
1

Buka storyboard file di mana viewController Anda ada, atau XIB file yang terkait dengan textEdit.app dan memeriksa apakah storyboard atau nama XIB adalah sama viewController Anda, kemudian mengubahnya, menyimpan dan isi ulang / restart Xcode.

Alessandro Ornano
sumber
1

Jika Anda menggunakan metode init khusus, periksa apakah Anda mengembalikan sesuatu yang valid. Saya menemukan sepotong kode yang mengalami crash seperti ini:

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
   } return self;
}

Di kelas lain, controller dibuat seperti ini:

CustomController *controller = [[CustomController alloc] init];

Masalahnya adalah bahwa dalam metode init, self belum berubah dan akan terlihat seperti ini sebagai gantinya:

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
      [controller viewDidLoad];
      self = controller;
   } return self;
}
Tanah Deklan
sumber
0

Saya ingin yang kedua Stephen J. Beberapa kali X Code hanya menjadi bingung. Saya hanya punya pengalaman di mana saya sering bermain-main dengan UI, dan telah menambah dan menghapus beberapa kali outlet. Outlet tidak akan terhubung lagi. Saya tidak pernah menemukan alasan tertentu (saya telah mencoba semua solusi di atas), dan saya hanya perlu menghapus NIB dan membuatnya kembali dari awal, dan sebenarnya harus menggunakan nama yang berbeda untuk NIB sebelum dapat berfungsi. (XCode 4.6.1) Menghabiskan beberapa jam untuk itu.

BrianH
sumber