簡體   English   中英

未能為 UIMainStoryboardFile 'Main' 實例化默認視圖 controller - 也許未設置指定的入口點?

[英]Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set?

我在新創建的應用程序中使用 Xcode,當我運行該項目時,它沒有顯示在 iOS 模擬器中,我收到以下消息:

未能為 UIMainStoryboardFile 'Main' 實例化默認視圖 controller - 也許未設置指定的入口點?

當然,我用谷歌搜索了一下,每個人都指出這是因為 Xcode 還不知道哪個視圖 controller 是初始視圖。 但奇怪的是,我將應用程序創建為基於頁面的應用程序(也嘗試了單視圖和選項卡式應用程序選項)應用程序和 Xcode 已經為它定義了一個 Storyboard。

此外,當我將 go 設置為項目的主界面選項時,設置了 storyboard(由 Xcode 本身命名為“Main”),並且在 Storyboard 中,我的視圖 controller 被設置為“初始視圖控制器”

是初始視圖控制器

怎么了?

在屬性檢查器中檢查是初始視圖控制器

在此處輸入圖片說明

所以這也發生在我身上。 我檢查了 50 次並且檢查了我的“是初始視圖控制器”,相信我。 它突然發生了。 那我是怎么修復的呢?

  1. 在您的項目中創建一個新的故事板,將其命名為 Main_iPhoneV2(或 iPadV2,具體取決於您的原始故事板樣式)
  2. 打開壞掉的故事板,點擊白色區域的任意位置並按command-a,然后command-c(全選並復制)
  3. 打開您的新故事板並按 command-v 粘貼相同的確切設置
  4. 轉到您的項目設置,將您的“主界面”更改為新的 Main_iPhoneV2(如果是您的 iPad 並且您正在編寫一個通用應用程序,則必須編輯 -Info.plist 並查找值“主故事板文件”基本名稱 (iPad)
  5. 重新編譯,不要再拔頭發了

首先單擊右側實用工具欄中的視圖控制器。 接下來選擇Attributes Inspector並確保在 View Controller 部分下選中了“Is Initial View Controller”復選框!

如果您有以下代碼,也會報告此警告:

    window = UIWindow(frame: UIScreen.mainScreen().bounds)
    window?.rootViewController = myAwesomeRootViewController
    window?.makeKeyAndVisible()

在這種情況下,轉到目標設置的第一頁並將Main Interface設置為空,因為您的應用程序不需要故事板條目。

我的 Tab Bar Controller 沒有出現在模擬器中並出現黑屏時,我遇到過這種情況。 為了讓我的應用程序出現在模擬器中,我執行了以下操作。

  1. 轉到 Main.storyboard。
  2. 檢查屬性檢查器選項卡下的Is Initial View Controller

是屬性檢查器中的初始視圖控制器。

如果您不小心刪除了該視圖控制器,或者以其他方式將其設為默認值,那么您將看到錯誤“無法實例化 UIMainStoryboardFile 'Main' 的默認視圖控制器 - 可能未設置指定的入口點?” 當您的應用程序啟動時,伴隨着純黑的屏幕。

要解決這個問題,打開你的 Main.storyboard 文件,找到你想在你的應用程序第一次運行時顯示的視圖控制器。 選中后,轉到屬性檢查器並選中標記為“是初始視圖控制器”的框。 您應該會看到一個向右的箭頭出現在該視圖控制器的左側,表明它是故事板的入口點。

使用界面生成器:

檢查是否設置了“是初始視圖控制器”。 您可以使用以下步驟進行設置:

  1. 選擇您的視圖控制器(將作為初始屏幕出現)。
  2. 實用程序窗口中選擇屬性檢查器。
  3. 從“視圖控制器”部分選擇“是初始視圖控制器”(如果不是)。

如果您已完成此步驟但仍出現錯誤uncheck and do it again.

解決問題的步驟

以編程方式使用:

目標-C:

        self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

        UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"]; // <storyboard id>

        self.window.rootViewController = viewController;
        [self.window makeKeyAndVisible];

        return YES;

斯威夫特:

        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

        var objMainViewController: MainViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MainController") as! MainViewController

        self.window?.rootViewController = objMainViewController

        self.window?.makeKeyAndVisible()

        return true

手動設置窗口,

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if (!application.keyWindow.rootViewController) 
     {
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

        UIViewController *myViewController= [storyboard instantiateViewControllerWithIdentifier:@"myViewController identifier"];

         application.keyWindow.rootViewController = myViewController;
     }
}

當我將故事板文件名“ Main.storyboard ”更改為:“ XXX.storyboard ”時出現此錯誤

我的解決方案是:

  • 產品->清潔
  • 更改:支持文件-> info.plist ->主故事板文件基本名稱->主要文件:XXX

祝你好運

以上都沒有為我解決這個問題。 在我的情況下,它也沒有設置正確的應用程序場景清單。

我不得不將 LoginScreen 更改為 Main

在此處輸入圖片說明

產品“清潔”是我的解決方案。

在此處輸入圖片說明

除了以上正確答案外,還要確保您在 General 中設置了正確的 Main Interface。

第一個選項

如果您想設置自定義故事板而不是默認視圖控制器。

從 info.plist 文件更改此屬性

<key>UISceneStoryboardFile</key> <string>Onboarding</string>

入職將是您的故事板名稱

打開這個右鍵單擊 info.plist 文件並作為源代碼打開

第二個選項

1- 單擊您的項目

2- 從目標部分選擇您的項目

3- 移至部署界面部分

4- 從主界面字段更改您的故事板部分

請記住設置您的故事板初始視圖控制器

如果您添加了新的故事板,那么您必須檢查以下幾點。

1) 在您的 plist 文件中,檢查主故事板文件基本名稱(iPad) 或 (iPhone) 的值應與您的故事板文件名匹配(不要添加擴展名.storyboard

2)在故事板中應該有一個視圖控制器設置為初始視圖控制器

3)清理並構建您的項目。 :)

在此處輸入圖片說明

如果您一直定期將代碼提交到源代碼管理,這可能會為您省去創建新故事板的麻煩,並可能會引入更多問題......

我能夠通過比較與損壞版本工作的版本的 Git 源代碼來解決這個問題。 差異顯示第一行應該包含初始視圖控制器的 Id,在我的例子中, initialViewController="Q7U-eo-vxw" 我搜索了源代碼以確保該 ID 存在。 我所要做的就是把它放回去,一切又恢復了!

<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="5056" systemVersion="13E28" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="Q7U-eo-vxw">
    <dependencies>
        <deployment defaultVersion="1296" identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
    </dependencies>
    <scenes>

以下是一些可以幫助您排除故障的步驟:

  1. 右鍵單擊失敗的 Storyboard 並使用 Source Control > Commit... 保留自上次提交以來的更改。
  2. 嘗試右鍵單擊失敗的 Storyboard 並使用“Open As > Source Code”來查看 Storyboard 的 XML。
  3. 文檔元素中,查找名為“ initialViewController ”的屬性。 如果丟失,請不要擔心,我們會修復它。 如果它在那里,雙擊分配給它的 id,command-c 復制它,command-f command-v 在文檔中更深入地搜索它。 這是應該提供初始視圖的控制器的標識符。 如果它沒有在文檔中定義,那么這是一個問題——你應該從文檔標簽中刪除它,在我的例子中initialViewController="Q7U-eo-vxw"
  4. 轉到名為“視圖”的 Xcode 菜單項,然后選擇“版本編輯器”>“顯示比較視圖”
  5. 這會在左側顯示您的本地版本,在右側顯示歷史版本。 單擊歷史版本下方的日期以獲取此故事板的提交列表。 選擇您知道有效的一個並比較文檔元素。 *initialViewController的 id 是什么? 不一樣嗎? 如果是這樣,請嘗試手動編輯它並運行。 運行中的 xcode 歷史比較工具

檢查 AppDelegate 中是否有窗口變量。

var window: UIWindow? 

還要檢查您的 Info.plist 文件的故事板。

<key>UIMainStoryboardFile</key>
<string>Main</string>

在 AppDelegate 中以編程方式設置 rootViewController 不會修復警告。 您應該選擇是讓故事板設置視圖控制器還是以編程方式進行。

在 Xcode 11 及更高版本中創建的項目,僅從項目設置更改主界面文件是不夠的。

您必須手動編輯 Info.plist 文件並為UISceneStoryboardFile設置故事板名稱。

如果您不使用 storyboard

打開info.plist 在info.plist文件中刪除如下特征 Information Property List -> Scene configuration -> Application Session Role -> Item 0 -> StoryBoard Name

如果你有場景委托,你必須檢查 info.plist

<key>UIApplicationSceneManifest</key>
    <dict>
        <key>UIApplicationSupportsMultipleScenes</key>
        <false/>
        <key>UISceneConfigurations</key>
        <dict>
            <key>UIWindowSceneSessionRoleApplication</key>
            <array>
                <dict>
                    <key>UISceneConfigurationName</key>
                    <string>Default Configuration</string>
                    <key>UISceneDelegateClassName</key>
                    <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
                    <key>UISceneStoryboardFile</key>
                    <string>Login</string>
                </dict>
            </array>
        </dict>
    </dict>

我在這里加載名為 Login.storyboard 的故事板

列表

如果您創建了一個名稱不是“Main”的新故事板,則會出現一些問題,但很容易調整......

因此,在您創建了一個具有所需名稱的新故事板並希望將其用作主要故事之后,請執行以下操作:

  1. 屬性檢查器中的復選框“是初始視圖控制器”1
  2. 為您的目標選擇所需的故事板作為“主界面”2
  3. 打開項目Info.plist並找到一個屬性“故事板名稱” ,您應該在其中鍵入所需的故事板名稱作為值3

在 XCode 14.0.1 中對我有用的是,除了設置初始視圖 controller 之外,還更新了構建設置:“UIKIT Main Storyboard File Base Name”為新名稱 storyboard

對於未來的讀者:- iOS 13、Swift 5

我從SceneDelegate以編程方式設置了初始視圖 controller,我得到了這個作為警告並且視圖 controller 設置完美。 所以我從Info.plist 中刪除了 Storyboard Name並且警告永遠消失了。

info.plist > Application Scene Manifest > Scene Configuration > Application Session Role > Storyboard Name > 刪除這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM