Xamarin.iOSのアンハンドルドエラーを解決した話

エラーの発生タイミングと発生したエラー

Xamarin.iOSで作成したアプリをデバック実行した際に、画面遷移のタイミングでエラーが発生していました。
そして、ハンドルされたエラーには、以下のメッセージが表示されていました。

  • Foundation.MonoTouchException: Objective-C exception thrown. Name: NSUnknownKeyException Reason: [ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key xxxView.

このメッセージの意味は簡単に言うと、「表示しようとしている画面のクラスにxxxViewという名前の項目がありません。」という意味です。
また、このエラーは、以下のクラスの「UIApplication.Main(args, null, "AppDelegate");」で発生していました。

namespace ToDoButton.iOS
{
    public class Application
    {
        // This is the main entry point of the application.
        static void Main(string[] args)
        {
            // if you want to use a different Application Delegate class from "AppDelegate"
            // you can specify it here.
            UIApplication.Main(args, null, "AppDelegate");
        }
    }
}

エラーの原因

画面遷移で発生していたエラーの原因は、ストーリーボードのViewControllerに紐づけたクラスのdesigner.csファイルが存在しなかったことでした。
Xamarin.iOSでは、ストーリーボードのViewControllerに配置したViewなどの情報を自動でdesigner.csファイルに定義しています。
そのため、designer.csファイルが存在しない場合、ストーリーボードのViewControllerへ配置したViewなどの情報がどこにも保存されなくなってしまいます。

結果として、画面実行時に、表示しようとしている画面にxxxViewという項目がありませんというエラーとなっているようです。

designer.csが存在しなかった原因

designer.csファイルが存在しなかった理由は、ソリューションからクラスを追加で作成したクラスをストーリーボードのViewControllerに紐づけていたためでした。

具体的には、以下の手順でストーリーボードのViewControllerにソリューションから追加したクラスを紐づけたことが原因でした。

【手順】

  1. ソリューションからクラスを追加でクラスを作成する
  2. 上記で作成したクラスのクラス名をストーリーボードのViewControllerのIdentityのClassに設定する
  3. 自動で作成されていたxxx_.csクラスを削除する

同じ失敗をしないために

今回のエラーは、自分で追加したクラスをストーリーボードのViewControllerに紐づけようとした結果発生していました。
(上記操作をしても、自分で追加したクラスには、designer.csファイルは追加されないため)
そして、ストーリーボードのIdentityのClassに値を入れることで自動生成されるクラスを使用すれば、このような問題は発生しませんでした。
(Xamarin.iOSでは、ストーリーボードのに値を入れることで必要なクラスを自動で作成してくれる)

そのため、ストーリーボードのViewControllerにクラスを紐づける場合は、以下の手順で操作を行えば、あるはずのdesigner.csファイルがないということによるエラーは発生しなくなります。

【手順】

  1. ストーリーボードのViewControllerのIdentityのClassにクラス名を設定する
  2. ストーリーボードを保存する
  3. ソリューションにトーリーボードのViewControllerのに設定したクラス名と同じ名称のファイルが作成されていることを確認する
  4. 上記ファイルに実行コードを記述していく

Xamarinの本

Xamarinネイティブによるモバイルアプリ開発 C#によるAndroid/iOS UI制御の基礎

Xamarinネイティブによるモバイルアプリ開発 C#によるAndroid/iOS UI制御の基礎

基礎から学ぶ Xamarinプログラミング

基礎から学ぶ Xamarinプログラミング

Xamarinエキスパート養成読本 (Software Design plus)

Xamarinエキスパート養成読本 (Software Design plus)


C#の本

独習C# 新版

独習C# 新版

Effective C# 6.0/7.0

Effective C# 6.0/7.0

[改訂新版]C#ポケットリファレンス

[改訂新版]C#ポケットリファレンス