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

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.


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


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.


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.


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


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.


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.


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).


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.


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 .


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à!


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"


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.


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!!!


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>

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.


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.


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.


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.


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.

0

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

Memperbaiki itu menghapus peringatan itu.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.