Xcode: "Không thể truy cập cảnh do thiếu điểm nhập" nhưng không thể tìm thấy


89

Xcode 4.5.2 đưa ra cho tôi cảnh báo sau:

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

Thật không may, tôi không thể xác định cảnh bị buộc tội. Việc chọn cảnh báo trong Bộ điều hướng sự cố không làm nổi bật bất kỳ điều gì trong Bảng phân cảnh. Tôi có một bảng phân cảnh khá phức tạp (hơn 30 cảnh).

Bất kỳ đề xuất?

Ảnh chụp màn hình để cảnh báo

Câu trả lời:


50

Mặc dù chủ đề này đã cũ, tôi không thấy câu trả lời mô tả những gì phù hợp với tôi, vì vậy đây là ...

Tôi đã gặp lỗi này và kiểm tra trực quan bảng phân cảnh cho thấy rằng tất cả bộ điều khiển chế độ xem dường như được kết nối với bộ điều khiển chế độ xem gốc.

Tôi đã thử đặt tên cho tất cả 17 bộ điều khiển chế độ xem trong bảng phân cảnh (như trong câu trả lời của @ bobnoble). Tôi đã sử dụng quy ước đặt tên dựa trên tên dài của bộ điều khiển chế độ xem, ví dụ: "jvc" cho "Bộ điều khiển chế độ xem công việc". Khi tôi cố gắng tạo, tôi nhận được thông báo lỗi trỏ đến một trong các bộ điều khiển chế độ xem là có tên trùng lặp. Theo dõi mọi thứ, tôi thấy rằng tôi có một bản sao thực sự của bộ điều khiển chế độ xem được xếp chồng lên nhau chính xác trên đầu của nó. Tôi nghi ngờ đó là thiệt hại do cắt và dán từ một thử nghiệm giao diện người dùng mà tôi đã không hoàn toàn loại bỏ.

Dù sao, việc xóa cặp song sinh không kết nối đã giải quyết được vấn đề của tôi. Sau đó, tôi đã xóa tất cả các tên VC vì chúng không được tham chiếu trong mã.


3
Điều này xảy ra với tôi cũng vậy, nhưng tôi vẫn phải điền vào một trong những sản phẩm nàoStoryboard ID
Pierre de LESPINAY

... thì tôi tin rằng @bobnoble là câu trả lời chính xác được đánh dấu bằng dấu √
SwiftArchitect

139

Trong bảng phân cảnh của bạn, hãy chọn từng bộ điều khiển chế độ xem (mũi tên màu đỏ trong hình ảnh bên dưới) và nhìn vào trường ID bảng phân cảnh (hình bầu dục màu đỏ). Không có trường ID bảng phân cảnh nào được để trống. Khi bạn tìm thấy một cái đó, đó là thủ phạm.

nhập mô tả hình ảnh ở đây


6
Xin chào @bobnoble, cảm ơn bạn đã trả lời. Một câu hỏi: tại sao tôi nên đặt ID Bảng phân cảnh cho mọi cảnh? Tôi không nghĩ nó là bắt buộc, phải không? Tôi biết rằng tôi phải đặt ID nếu tôi muốn truy cập cảnh theo chương trình, nhưng điều gì sẽ xảy ra nếu tất cả các cảnh của tôi được kết nối thông qua các segues? Hay nó chỉ là thực hành lập trình tốt?
Wolfy 23/11/12

@Wolfy - điểm tốt, bạn cần phải xem xét từng thứ để đảm bảo rằng nó có ID segue hoặc Storyboard.
bobnoble

2
Cố gắng giải pháp này, tôi nhận ra rằng chỉ dùng làm một cụ Storyboard IDloại bỏ các cảnh báo
Pierre de LESPINAY

Tôi đã có UINavigationControllermột số UIViewControllersvà phải đặt số nhận dạng cho tất cả chúng, thậm chí tôi chưa bao giờ gọi một trong số chúng bằng mã định danh. Thật sự rất khó chịu, tìm một lỗi mà không có ai ở!
Alex Cio

Làm việc cho tôi. Có ai biết tại sao điều này phát sinh? Có vẻ như rất khó phát hiện - lỗi được đưa ra, khi nhìn lại, đưa ra một manh mối ít ỏi. Tôi đã nhận được nó sau khi chuyển đổi một bảng phân cảnh thành bảng phân cảnh mới nhất và lớn nhất - nếu ID bảng phân cảnh là bắt buộc bây giờ, thì chắc chắn nó đã không xảy ra trước đây và tính năng tự động chuyển đổi không quan tâm đến nó.
Josh Sutterfield

30

Tôi vừa gặp lỗi chính xác này với Bảng phân cảnh một cảnh đơn giản và tất cả những gì tôi phải làm để khắc phục nó là chọn hộp kiểm "Là Bộ điều khiển chế độ xem ban đầu" cho bộ điều khiển 1 chế độ xem trong Bảng phân cảnh. Tôi nghi ngờ Xcode được sử dụng để chọn hộp này cho bạn theo mặc định trong trường hợp này, nhưng không còn nữa.

Đánh dấu vào ô ở dưới cùng

                                     

Chọn hộp cho chính xác một trong các bộ điều khiển chế độ xem trong bảng phân cảnh của bạn và bạn sẽ tốt.


1
Cảm ơn. Điều đó là vậy đó!
Eric Chen

20

Tôi e rằng bạn sẽ phải xem qua tất cả 30 người trong số họ và kiểm tra xem họ có ID Bảng phân cảnh hay một mã xác định cho bộ điều khiển chế độ xem đó hay không. Một trong hai là bắt buộc, cả hai cũng là một tùy chọn.


5
Sau khi tất cả các bộ điều khiển chế độ xem có segue hoặc ID của chúng, thông báo lỗi có thể vẫn ở đó. Trong trường hợp này, hãy làm sạch sản phẩm và nó sẽ biến mất.
Reinhard Männer

5
Trong trường hợp của tôi, một sản phẩm sạch không đủ để loại bỏ thông báo lỗi sau khi tôi đã sửa lỗi. Nó đã biến mất khi tôi khởi động lại Xcode. (Tôi đã không thử đóng / mở lại dự án. Điều đó có thể cũng đã thành công.)
JulianSymes

Đối với tôi cũng vậy - cuối cùng bạn cần dừng và khởi động lại xcode để loại bỏ thông báo lỗi.
MusiGenesis

8

Sự cố này có thể xảy ra trong một trong các trường hợp sau:

Trường hợp I: Nếu không có cảnh nào trong bảng phân cảnh được đánh dấu là "isInitialViewController" .

Khắc phục: Xác định bộ điều khiển chế độ xem gốc và đánh dấu nó là "isInitialViewController" trong SB của bạn. Trong trường hợp này, id bảng phân cảnh là không bắt buộc.

Trường hợp II

Có thể có những trường hợp mà bạn không cần phải có InitialViewController trong bảng phân cảnh. Ví dụ: khi sử dụng Nhiều bảng phân cảnh.

Khắc phục: Trong những trường hợp như vậy, hãy đảm bảo rằng "id bảng phân cảnh" được cung cấp chính xác và bạn tham khảo cảnh đầu tiên được sử dụng trong bảng phân cảnh bằng cách sử dụng id này. Ví dụ:

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

Trong trường hợp này, "id bảng phân cảnh" là bắt buộc.

Trường hợp III

Bạn đã kết nốiViewController ban đầu. Nhưng bạn vẫn nhận được cảnh báo này. Điều này là do một số cảnh trong bảng phân cảnh có thể không được kết nối với "segue" và chúng cũng không có "id bảng phân cảnh" . Quét bảng phân cảnh của bạn, xem liệu có cần một "segue" hay không . Kết nối segue nếu điều đó bị thiếu. Nếu không cần thiết kế, hãy đảm bảo rằng bạn cần cung cấp "id bảng phân cảnh" vì đó là cách duy nhất để tham chiếu cảnh từ mã của bạn, như được hiển thị trong mã ví dụ ở trên.

Hi vọng điêu nay co ich


TRƯỜNG HỢP III - đã giúp tôi. Cảm ơn!
mrGott

Tôi đã gặp trường hợp Dự án mẫu đi kèm với tệp xib cũ. Tôi tạo ra một kịch bản và tôi hiện đang bị .. cần phải chuyển đổi các xib sang định dạng Storyboard và di chuyển từ đó .. không thể nhìn thấy bất cứ cách nào để tạo ra một cảnh ứng dụng hoặc một trình đơn ..
nyxee

6

Bạn không cần thiết lập Storyboard IDcho tất cả các cảnh hoặcUINavigationController

Tôi có khoảng 50-60 cảnh và tôi chỉ nhận được những cảnh báo này để tôi nhận ra rằng chỉ bộ điều khiển (Scene) hoặc NavigationController không được kết nối với segue mới cần đặt Storyboard ID.

nhập mô tả hình ảnh ở đây

Bạn có thể thấy rằng trong hình trên UINavigationControllerkhông được kết nối với segue, nó là một thủ phạm của cảnh báo đó.

Chỉ cần cung cấp cho nó một ID Bảng phân cảnh để xóa cảnh báo này.


5

Tôi gặp vấn đề tương tự. Tôi có rất nhiều lượt xem trên bảng phân cảnh của mình với bộ điều khiển điều hướng và thanh tab. Đối với tôi, đó chỉ là một lời cảnh báo để bạn biết rằng một số chế độ xem không được kết nối. Đảm bảo rằng tất cả các chế độ xem của bạn được kết nối theo một cách nào đó với bộ điều khiển chế độ xem gốc . Tôi đã bắt đầu dự án này từ đầu để loại bỏ cảnh báo này và nhận thấy cảnh báo tương tự khi một chế độ xem không được kết nối.


Điều này đã giúp cho tôi. Tôi đang sử dụng vượt quá 7.1.1 Swift 2. StoryBoard ban đầu CÓ là bộ điều khiển chế độ xem gốc.
Lukesivi

3

Cách đơn giản nhất để tìm hiện trường vi phạm:

Đi tới trình điều hướng sự cố (trong bảng điều khiển bên trái, bên cạnh nút tìm kiếm) và nhấp đúp vào lỗi. Một cửa sổ sẽ bật lên có chứa cảnh vi phạm ở chính giữa cửa sổ.

(Điều này thực sự đúng - nhấp đúp vào bất kỳ lỗi nào nói chung sẽ dẫn đến một cửa sổ bật lên chứa lỗi được căn giữa - một mẹo nhỏ rất hay!)

Lưu ý bên: Đôi khi, XCode sẽ đưa ra lỗi này không chính xác cho một cảnh là bộ điều khiển chế độ xem gốc của bộ điều khiển điều hướng (đó là bộ điều khiển chế độ xem ban đầu). Cách khắc phục đơn giản là cấp cho bộ điều khiển chế độ xem gốc này ID Storyboard, biên dịch (lỗi sẽ biến mất), sau đó xóa storyboardID (không còn lỗi nữa).


Cảm ơn vì gợi ý của bạn "Cách khắc phục đơn giản là cấp cho bộ điều khiển chế độ xem gốc này một ID Bảng phân cảnh". Nó đã giải quyết vấn đề của tôi. Chà, tôi cần cung cấp 'ID bảng phân cảnh' cho UINavigationController.
Mohd Haider

Điều này chỉ cho tôi đến Cảnh ứng dụng với Menu chính. Không thể cung cấp ID Bảng phân cảnh đó.
Daniel

2

Cách dễ nhất để xem bộ điều khiển hoặc cảnh nào đang gây ra sự cố này là:

  • Nhấn Ctrl khi nhấp vào của bạn .storyboardtrong Bộ điều hướng dự án và chọn Open As > Source Code. Điều này sẽ hiển thị XML cơ bản của Bảng phân cảnh.
  • Theo quan điểm này, cảnh báo rõ ràng sẽ liên quan đến một dòng trong XML có liên quan đến cảnh vi phạm.

Bây giờ, trong trường hợp của tôi, cảnh báo đặc biệt khó chịu vì "hiện trường vi phạm" có một số nhận dạng và một segue! Tôi đã có thể khắc phục sự cố bằng cách xóa cảnh và sau đó hoàn tác việc xóa. Không thanh lịch, nhưng đã làm việc. Tôi đã lưu Bảng phân cảnh của mình trước khi thực hiện việc này. Nhìn lại, lẽ ra tôi nên tạo một bản sao và difflàm trước-sau.


2
Thật kỳ lạ, điều này dường như không hoạt động nhất quán. Trong tình huống nghe lén của tôi, nó đã hoạt động. Bây giờ tôi đang kiểm tra nó và Source Codechế độ xem không hiển thị lỗi. Vì vậy, số dặm có thể thay đổi.
Dmitry Minkovsky

Tôi không tìm thấy Bộ điều khiển Chế độ xem với điều này, nhưng tôi đã xóa nó (trong XML, không hoạt động trong ID) và cảnh báo đã biến mất.
Daniel

2

Đối với tôi, đó không phải là vì a Storyboard IDhay a Segue. Tôi đã nhận được cảnh báo này bởi vì tôi đã không đặt View Controller's Custom Class.

Chọn View Controllervào Storyboard, sau đó trong Utilities Pane, chọn Identity Inspectorbiểu tượng. Dưới đây Custom Class, hãy xem giá trị bên trong Classtrường.

Nếu nó chỉ cho biết UIViewController, thì bạn cần phải nhập tên lớp. Đây sẽ là tên của bạn .h.mcác tệp tạo nên UIViewControllerlớp con tùy chỉnh của bạn .


Tôi vừa có một biến thể về điều này. Tôi đã đối sánh sai ViewController trong bảng phân cảnh của mình với lớp ViewController và điều tương tự với ID bảng phân cảnh.
Vince O'Sullivan

2

Tôi đã đến câu hỏi này ngày hôm nay. Tôi đang sử dụng Xcode 6.3 và câu trả lời cho câu hỏi của OP bây giờ khá đơn giản:

Chọn Bộ điều khiển Chế độ xem mà bạn muốn là người đầu tiên, hiển thị Trình kiểm tra Thuộc tính và trong phần Bộ điều khiển Chế độ xem, hãy đảm bảo

Là bộ điều khiển chế độ xem ban đầu

được kiểm tra. Voilà!


2

Với Xcode 7, điều này có thể được xử lý dễ dàng. Không cần phải tự đi qua tất cả các cảnh để tìm một cảnh có vấn đề. Trước tiên, hãy chuyển đến trình điều hướng Báo cáo , nơi bạn có thể nhận được thông tin chi tiết hơn về các vấn đề đã biết. Mô tả vấn đề có thể trông như sau:

Base.lproj / Main.storyboard: fPh-fe-F5F : cảnh báo: Không thể truy cập cảnh do thiếu điểm nhập và không có mã định danh để truy cập thời gian chạy qua -instantiateViewControllerWithIdentifier :.

Với thông tin này, bạn có thể sao chép id đối tượng, trong trường hợp này là fPh-fe-F5F và tìm kiếm không gian làm việc cho sự xuất hiện của chuỗi này. Chuỗi sẽ được tìm thấy trong tệp Main.storyboard. Nhấp đúp vào kết quả tìm kiếm và nó sẽ được mở Main.storyboard với cảnh đã chọn. Khi bạn biết một cảnh có vấn đề, bạn có thể dễ dàng khắc phục sự cố bằng cách đặt ID bảng phân cảnh hoặc đặt "Là bộ điều khiển chế độ xem ban đầu"


1

Bạn chỉ có thể đặt một số nhận dạng. Trên trình kiểm tra thuộc tính ở khung bên phải, bạn sẽ tìm thấy một trường có tên "Số nhận dạng". Chỉ cần đặt bất kỳ chuỗi nào vào đó, điều này sẽ hoạt động

Bạn có thể nhấp vào bộ điều khiển điều hướng và trong trình kiểm tra thuộc tính, hãy nhấp vào nút "là bộ điều khiển chế độ xem ban đầu" và điều này cũng sẽ hoạt động.


1
Mohammad, cảm ơn vì đã trả lời nhưng vấn đề là: tôi nên đặt số nhận dạng ở cảnh nào? Tôi không thể xác định được hiện trường gây ra cảnh báo, đó là vấn đề chính.
Wolfy 23/11/12

1

tôi phải đối mặt với vấn đề tương tự và đã giải quyết bằng cách đặt trên storyboard ID bất kỳ số nhận dạng nào cho tất cả viewController và NavigationController cũng vậy; lỗi sẽ được xóa ngay lập tức

thưởng thức!!!


0

Có thể XQuery này sẽ giúp bạn tìm thấy những cảnh khó chịu đó

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

Nếu bạn đã cài đặt xqilla, bạn sẽ lưu truy vấn vào một tệp và sử dụng nó như

xqilla <xqueryfile> -i <path to your storyboard>

0

Tôi không biết có phải điều này vẫn chưa được đề cập hay không nhưng một lý do khác khiến bạn có thể nhận được cảnh báo này là nếu bạn có một kẻ xấu đi sai hướng. Ví dụ: trong dự án của tôi, tôi nhận được cảnh báo này nhưng trên thực tế tất cả các bộ điều khiển của tôi đã được kết nối. Tuy nhiên, một trong số họ có một giả thuyết rằng về cơ bản là cố gắng trình bày cha mẹ từ đứa trẻ thay vì cha mẹ giới thiệu đứa trẻ. Điều này gây ra cảnh báo tương tự.


0

Tôi nhận được cảnh báo này khi tôi đang có một UIViewController trong Storyboard mà không có gì được đặt. Tôi đã tránh cảnh báo này bằng cách đặt ID Bảng phân cảnh cho nó.


0

Tôi đã gặp vấn đề tương tự, nhưng tôi nhận ra rằng tôi đang sử dụng chế độ xem vùng chứa và thay vì xóa bộ điều khiển chế độ xem mặc định, tôi đã xóa bộ điều khiển chế độ xem của nó. Vì vậy bộ điều khiển chế độ xem vẫn còn trong bảng phân cảnh và cảnh báo cũng vậy. Vì vậy, đây là một trong những trường hợp cảnh báo bật lên nếu bộ điều khiển chế độ xem mặc định của chế độ xem vùng chứa không được xóa đúng cách khi bạn không cần nó.


0

Tôi đã thử mọi thứ được mô tả ở trên nhưng không có kết quả. Tôi đã kết nối mọi thứ đúng cách trong IB, với chính xác một UIViewControllerbộ điều khiển chế độ xem gốc được chỉ định. Tôi không có số nhận dạng nhưng đã thêm chúng vào tất cả các bộ điều khiển của mình.

Cách duy nhất tôi có thể khiến cảnh báo biến mất là làm mọi thứ ở trên (bao gồm khởi động lại máy tính và xây dựng sạch sẽ) sau đó chuyển sang nhánh không có lỗi của dự án của tôi trong git và quay lại.

Không chắc chắn hành động nào đã khắc phục sự cố hoặc hành động kết hợp nào, nhưng bản thân nó không phải là bản dựng sạch. Đây có thể là một sản phẩm phụ của Main.storyboard luôn thay đổi khi được mở đơn giản, có nghĩa là tôi phải làm git commit -m "Stupid storyboard"thường xuyên hơn tôi muốn.


0

Đây là những gì đã làm việc cho tôi:

  1. Mở bảng phân cảnh trong trình soạn thảo văn bản.
  2. Thay đổi phiên bản từ 3.0 sang 2.0, lưu và đóng nó.
  3. Mở lại trong studio trực quan. Nó sẽ tự động chuyển đổi và mở tài liệu.

0

Tôi gặp lỗi tương tự: Đối với tôi, lỗi là tôi đã không khởi tạo bộ điều khiển chế độ xem trong bảng câu chuyện của mình.

Việc sửa lỗi đã xóa cảnh báo đó.


0

Tôi chỉ cần cung cấp cho tất cả các MVC một id bảng phân cảnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.