Xcode: “Scene tidak dapat dijangkau karena kurangnya titik masuk” tetapi tidak dapat menemukannya

89

Xcode 4.5.2 memberi saya peringatan berikut:

Unsupported Configuration    
Scene is unreachable due to lack of entry points and does not have an identifier 
for runtime access via -instantiateViewControllerWithIdentifier:.

Sayangnya saya tidak dapat mengidentifikasi adegan yang memberatkan. Memilih peringatan di Issue Navigator tidak menyoroti apa pun di Storyboard. Saya memiliki storyboard yang cukup rumit (30+ adegan).

Ada saran?

Tangkapan layar untuk peringatan

Wolfy
sumber

Jawaban:

50

Meskipun utas ini sudah lama, saya tidak melihat jawaban yang menjelaskan apa yang berhasil untuk saya, jadi begini ...

Saya mengalami kesalahan ini dan pemeriksaan visual storyboard menunjukkan bahwa semua pengontrol tampilan tampaknya terhubung ke pengontrol tampilan root.

Saya mencoba memberi nama semua 17 pengontrol tampilan di storyboard (seperti dalam jawaban @ bobnoble). Saya menggunakan konvensi penamaan berdasarkan nama panjang pengontrol tampilan, misalnya "jvc" untuk "Jobs View Controller". Ketika saya mencoba membangun, saya mendapat pesan kesalahan yang menunjuk ke salah satu pengontrol tampilan sebagai memiliki nama duplikat. Melacak semuanya, saya menemukan bahwa saya memiliki duplikat sebenarnya dari pengontrol tampilan yang ditumpuk persis di atas kembarannya. Saya menduga itu adalah kerusakan potong-dan-tempel dari eksperimen antarmuka pengguna yang tidak saya batalkan sepenuhnya.

Bagaimanapun, menghapus kembaran yang tidak terhubung menyelesaikan masalah saya. Setelah itu, saya menghapus semua nama VC karena tidak direferensikan dalam kode.

Bob H.
sumber
3
Ini terjadi pada saya juga, tetapi saya masih harus mengisi salah satu dari banyak yang kosongStoryboard ID
Pierre de LESPINAY
... maka saya yakin @bobnoble adalah jawaban yang benar untuk ditandai dengan √
SwiftArchitect
139

Di storyboard Anda, pilih setiap pengontrol tampilan (panah merah pada gambar di bawah) dan lihat bidang ID Storyboard (oval merah). Tidak satu pun bidang ID Papan Cerita harus kosong. Jika Anda menemukan salah satunya, itulah pelakunya.

masukkan deskripsi gambar di sini

bobnoble
sumber
6
Hai @bobnoble, terima kasih atas balasan Anda. Satu pertanyaan: mengapa saya harus menetapkan ID Papan Cerita untuk setiap adegan? Saya tidak berpikir itu wajib, bukan? Saya tahu bahwa saya harus menetapkan ID jika saya ingin mengakses adegan secara terprogram, tetapi bagaimana jika semua adegan saya terhubung melalui segue? Atau apakah itu hanya praktik pemrograman yang baik?
Wolfy
@ Wolfy - poin bagus, Anda perlu melihat masing-masing untuk memastikannya memiliki segue atau Storyboard ID.
bobnoble
2
Mencoba solusi ini, saya menyadari bahwa mengisi hanya satu tertentu Storyboard IDmenghapus peringatan
Pierre de LESPINAY
Saya punya UINavigationControllerbeberapa UIViewControllersdan harus mengatur pengenal untuk semuanya, bahkan saya tidak pernah memanggil salah satunya dengan pengenal. Benar-benar menjengkelkan, mencari bug di mana tidak ada orang!
Alex Cio
Bekerja untuk saya. Adakah yang tahu mengapa ini muncul? Tampaknya sangat tidak dapat ditemukan - kesalahan yang diberikan, jika dipikir-pikir, memberikan sedikit petunjuk. Saya mendapatkannya setelah mengubah storyboard menjadi yang terbaru dan terhebat - jika Storyboard ID diperlukan sekarang, tentu saja tidak sebelumnya, dan konversi otomatis tidak menanganinya.
Josh Sutterfield
30

Saya baru saja mendapatkan kesalahan yang sama persis dengan Storyboard satu adegan sederhana, dan yang harus saya lakukan untuk memperbaikinya hanyalah mencentang kotak centang "Is Initial View Controller" untuk 1 view controller di Storyboard. Saya menduga Xcode biasa mencentang kotak ini untuk Anda secara default dalam situasi ini, tetapi sekarang tidak lagi.

Centang kotak di bagian bawah

                                     

Centang kotak untuk salah satu pengontrol tampilan di storyboard Anda dan Anda akan melakukannya dengan baik.

w0mbat.dll
sumber
1
Terima kasih. Itu dia!
Eric Chen
20

Saya khawatir Anda harus melalui semua 30 dari mereka, dan memeriksa apakah mereka memiliki ID Storyboard atau segue ke pengontrol tampilan itu. Salah satu dari keduanya diperlukan, keduanya juga merupakan opsi.

Scott Berrevoets
sumber
5
Setelah semua pengontrol tampilan memiliki segue atau ID mereka, pesan kesalahan mungkin masih ada. Dalam kasus ini, bersihkan produk, dan produk akan hilang.
Reinhard Männer
5
Dalam kasus saya, produk yang bersih tidak cukup untuk menghilangkan pesan kesalahan setelah saya memperbaiki kesalahan tersebut. Itu hilang ketika saya memulai ulang Xcode. (Saya tidak mencoba menutup / membuka kembali proyek. Itu mungkin berhasil juga.)
JulianSymes
Sama untuk saya - pada akhirnya Anda harus menghentikan dan memulai ulang xcode untuk menghilangkan pesan kesalahan.
MusiGenesis
8

Masalah ini dapat terjadi dalam salah satu skenario berikut ini:

Kasus I: Jika tidak ada adegan di storyboard yang ditandai sebagai "isInitialViewController" .

Fix: Identifikasi pengontrol tampilan root dan tandai sebagai "isInitialViewController" di SB Anda. Dalam hal ini id storyboard tidak wajib.

Kasus II

Mungkin ada situasi di mana Anda tidak perlu memiliki initialViewController di storyboard. Misalnya: saat menggunakan Beberapa storyboard.

Cara Memperbaiki: Dalam kasus seperti itu, pastikan "id papan cerita" diberikan dengan benar dan Anda mengacu pada adegan pertama yang digunakan di papan cerita menggunakan id ini. Misalnya:

UIStoryboard *myStoryBoard = [UIStoryboard storyboardWithName:@"MyStoryBoardName" bundle:nil];
MyViewController *myViewController = (MyViewController *)[myStoryBoard instantiateViewControllerWithIdentifier:@"MyViewControllerId"];

Dalam hal ini "id papan cerita" adalah wajib.

Kasus III

Anda memiliki initialViewController yang terhubung. Tapi tetap saja Anda mendapatkan peringatan ini. Ini karena beberapa adegan di storyboard mungkin tidak terhubung dengan "segue" dan juga tidak memiliki "id storyboard" . Pindai storyboard Anda, lihat apakah "segue" diperlukan. Hubungkan segue jika tidak ada. Jika segue tidak diperlukan, pastikan Anda perlu memberikan "id storyboard" karena ini adalah satu-satunya cara untuk merujuk adegan dari kode Anda, seperti yang ditunjukkan pada contoh kode di atas.

Semoga ini membantu

syah1988
sumber
KASUS III - membantu saya. Terima kasih!
mrGott
Saya punya kasus di mana Proyek sampel datang dengan file xib lama. Saya membuat storyBoard dan saat ini saya menderita .. perlu mengubah xib ke format storyBoard dan pindah dari sana .. tidak dapat melihat cara apa pun untuk membuat adegan aplikasi atau menu ..
nyxee
6

Anda tidak perlu mengatur Storyboard IDuntuk semua adegan atauUINavigationController

Saya memiliki sekitar 50-60 adegan dan saya baru saja mendapat peringatan ini sehingga saya menyadari bahwa hanya pengontrol (Scene) atau NavigationController yang tidak terhubung dengan segue yang perlu disetel Storyboard ID.

masukkan deskripsi gambar di sini

Anda dapat melihat bahwa pada gambar di atas UINavigationControllertidak berhubungan dengan segue, itu adalah penyebab peringatan itu.

Cukup berikan ID Storyboard untuk menghapus peringatan ini.

Kampai
sumber
5

Saya memiliki masalah yang sama. Saya mendapat banyak penayangan di papan cerita saya dengan pengontrol bilah navigasi dan tab. Bagi saya itu hanya peringatan untuk memberi tahu Anda bahwa beberapa pandangan tidak terhubung. Pastikan semua tampilan Anda terhubung dengan cara tertentu ke pengontrol tampilan root . Saya memulai proyek ini dari awal untuk menghilangkan peringatan ini dan memperhatikan peringatan yang sama ketika tampilan tidak terhubung.

Richard
sumber
Ini membantu saya. Saya menggunakan melebihi 7.1.1 Swift 2. StoryBoard Awal HARUS menjadi pengontrol tampilan root.
Lukesivi
3

Cara termudah untuk menemukan adegan yang menyinggung:

Buka navigator masalah (di panel kiri, di samping tombol pencarian), dan klik dua kali kesalahan tersebut. Sebuah jendela akan muncul berisi adegan menyinggung yang berpusat di tengah jendela.

(Ini sebenarnya secara umum benar - mengklik dua kali kesalahan apa pun umumnya akan menghasilkan munculan yang berisi kesalahan di tengah - trik kecil yang rapi!)

Catatan samping: Terkadang, XCode salah memberikan kesalahan ini untuk adegan yang merupakan pengontrol tampilan root dari pengontrol navigasi (yaitu pengontrol tampilan awal). Perbaikan sederhana adalah memberikan pengontrol tampilan root ini ID Storyboard, kompilasi (kesalahan harus hilang), dan kemudian menghapus storyboardID (tidak ada kesalahan lagi).

ajay14
sumber
Terima kasih untuk petunjuk Anda "Perbaikan sederhana adalah memberikan pengontrol tampilan root ini ID Storyboard". Itu memecahkan masalah saya. Nah, saya perlu memberikan 'Storyboard ID' ke UINavigationController.
Mohd Haider
Ini mengarahkan saya ke Scene Aplikasi dengan Menu Utama. Tidak bisa memberikan ID Papan Cerita itu.
Daniel
2

Cara termudah untuk melihat pengontrol, atau adegan, yang menyebabkan masalah ini adalah dengan:

  • Ctrl-klik Anda .storyboarddi Project Navigator dan memilih Open As > Source Code. Ini akan memunculkan XML yang mendasari Storyboard.
  • Dalam tampilan ini, peringatan akan secara jelas terkait dengan baris dalam XML yang terkait dengan adegan yang melanggar.

Sekarang, dalam kasus saya, peringatan itu sangat mengganggu karena "adegan yang menyinggung" memiliki pengenal dan segue! Saya bisa memperbaiki masalah dengan menghapus adegan dan kemudian membatalkan penghapusan. Tidak elegan, tapi berhasil. Saya menyimpan Storyboard saya sebelum melakukan ini. Dalam retrospeksi, saya seharusnya membuat salinan dan diffsebelum-sesudahnya.

Dmitry Minkovsky
sumber
2
Anehnya, ini sepertinya tidak bekerja secara konsisten. Dalam situasi saya yang disadap, itu berhasil. Sekarang saya sedang mengujinya, dan Source Codetampilan tidak menunjukkan kesalahan. Jadi, jarak tempuh bisa bervariasi.
Dmitry Minkovsky
Saya tidak menemukan View Controller dengan ini, tetapi saya menghapusnya (dalam XML, tidak berfungsi di ID) dan peringatan itu hilang.
Daniel
2

Bagi saya, itu bukan karena a Storyboard IDatau a Segue. Saya menerima peringatan ini karena saya belum menyetel View Controller's Custom Class.

Pilih View Controllerdi Storyboard, lalu di Utilities Pane, pilih Identity Inspectorikon. Di bawah Custom Class, lihat nilai apa yang ada di dalam Classbidang.

Jika hanya tertulis UIViewController, maka Anda perlu mengetikkan nama kelas. Ini akan menjadi nama .hdan .mfile Anda yang membentuk UIViewControllersubkelas khusus Anda .

pengguna3344977
sumber
Saya baru saja membuat variasi tentang ini. Saya mencocokkan ViewController yang salah di storyboard saya dengan kelas ViewController, dan sama dengan ID Storyboard.
Vince O'Sullivan
2

Saya sampai pada pertanyaan ini hari ini. Saya menggunakan Xcode 6.3 dan jawaban untuk pertanyaan OP cukup sederhana sekarang:

Pilih View Controller yang Anda inginkan menjadi yang pertama, tunjukkan Attributes Inspector, dan di bawah bagian View Controller, pastikan

Apakah Pengontrol Tampilan Awal

diperiksa. Voilà!

Zonker.in.Geneva
sumber
2

Dengan Xcode 7 ini dapat ditangani dengan mudah. Tidak perlu menelusuri semua adegan secara manual untuk menemukan adegan yang bermasalah. Pertama, buka navigator Laporan , tempat Anda bisa mendapatkan info lebih detail tentang masalah yang diketahui. Deskripsi masalah dapat terlihat seperti ini:

Base.lproj / Main.storyboard: fPh-fe-F5F : peringatan: Scene tidak dapat dijangkau karena kurangnya titik masuk dan tidak memiliki pengenal untuk akses runtime melalui -instantiateViewControllerWithIdentifier :.

Dengan info ini, Anda dapat menyalin id objek, dalam hal ini adalah fPh-fe-F5F , dan mencari ruang kerja untuk terjadinya string ini. String akan ditemukan di file Main.storyboard. Klik dua kali pada hasil pencarian dan itu akan membuka Main.storyboard dengan adegan yang dipilih. Setelah mengetahui adegan yang bermasalah, Anda dapat dengan mudah memperbaiki masalah tersebut, dengan menyetel ID storyboard atau menyetel "Is Initial View Controller"

Sergio
sumber
1

Anda tinggal menyetel pengenal. Pada inspektur atribut di panel kanan, Anda akan menemukan bidang bernama "Identifier". Letakkan saja string apa saja di sana, ini akan berfungsi

Anda dapat mengklik pada pengontrol navigasi dan di bawah atribut inspektur, klik tombol "adalah pengontrol tampilan awal", dan ini juga akan berfungsi.

Mohammad Rabi
sumber
1
Mohammad, terima kasih telah membalas tetapi masalahnya adalah: di adegan mana saya harus menetapkan pengenal? Saya tidak dapat menemukan adegan yang menyebabkan peringatan itu, itu masalah utamanya.
Wolfy
1

saya menghadapi masalah yang sama dan diselesaikan dengan memasang ID storyboard pengenal untuk semua viewController dan NavigationController juga; kesalahan akan segera dihapus

Nikmati!!!

Sonik
sumber
0

Mungkin XQuery ini akan membantu Anda menemukan adegan-adegan buruk itu

for $i in .//scene/objects/*[1][not(@storyboardIdentifier) or @storyboardIdentifier= '']/@id      (: find every scene that has an empty storyboardIdentifier :)
where count(.//segue[@destination= $i])= 0 and $i!= ./document/@initialViewController             (: filter the results to the scenes that are not destinations of a segue and exclude the initialViewController :) 
return ($i, $i/../@customClass)                                                                   (: return the storyboard-id and the customClass, if any :)

Jika Anda menginstal xqilla, Anda akan menyimpan kueri ke file dan menggunakannya seperti

xqilla <xqueryfile> -i <path to your storyboard>
paralaks
sumber
0

Saya tidak tahu apakah ini belum disebutkan atau tidak, tetapi alasan lain Anda bisa mendapatkan peringatan ini adalah jika Anda memiliki aliran ke arah yang salah. Misalnya, dalam proyek saya, saya mendapatkan peringatan ini tetapi semua pengontrol saya sebenarnya terhubung. Namun, salah satunya memiliki segue yang pada dasarnya mencoba menghadirkan orang tua dari anak, bukan orang tua yang menghadirkan anak. Ini menyebabkan peringatan yang sama.

miken.mkndev
sumber
0

Saya mendapat peringatan ini ketika saya memiliki UIViewController di Storyboard yang tidak ada yang disetel. Saya menghindari peringatan ini dengan mengatur ID Storyboard padanya.

Durga Vundavalli
sumber
0

Saya memiliki masalah yang sama, tetapi saya menyadari bahwa saya menggunakan tampilan kontainer dan alih-alih menghapus pengontrol tampilan default, saya menghapus segue-nya. Jadi pengontrol tampilan tetap di storyboard dan begitu pula peringatannya. Jadi ini adalah salah satu kasus di mana peringatan muncul jika pengontrol tampilan default dari tampilan kontainer tidak dihapus dengan benar saat Anda tidak membutuhkannya.

dalam
sumber
0

Saya mencoba semua yang dijelaskan di atas tetapi tidak berhasil. Saya memiliki semuanya terhubung dengan benar di IB, dengan tepat satu yang UIViewControllerditunjuk sebagai pengontrol tampilan root. Saya tidak memiliki pengenal tetapi menambahkannya ke semua pengontrol saya.

Satu-satunya cara saya bisa menghilangkan peringatan itu adalah dengan melakukan semua hal di atas (termasuk reboot komputer dan clean build) kemudian beralih ke cabang proyek saya yang bebas kesalahan di git dan kembali lagi.

Tidak yakin tindakan mana yang memperbaikinya, atau kombinasi tindakan mana, tetapi itu bukan clean build sendiri. Ini mungkin produk sampingan dari Main.storyboard yang selalu berubah setelah dibuka, yang berarti saya harus melakukannya git commit -m "Stupid storyboard"lebih sering daripada yang saya inginkan.

Corwin Newall
sumber
0

Inilah yang berhasil untuk saya:

  1. Buka papan cerita di editor teks.
  2. Ubah versi dari 3.0 ke 2.0 simpan dan tutup.
  3. Buka lagi di studio visual. Ini secara otomatis akan mengubah dan membuka dokumen.
vegas2ny.dll
sumber
0

Saya mendapat kesalahan yang sama: Bagi saya kesalahannya adalah saya tidak memulai pengontrol tampilan di papan cerita saya.

Memperbaiki itu menghapus peringatan itu.

Vetri Selvi Vairamuthu
sumber
0

Cukup memberi semua MVC id storyboard sudah berhasil untuk saya.

Elia Döhler
sumber