7

私は、スタンフォード CS193p iOS プログラミングの講義に沿って進めようとしています。「Happiness」と呼ばれるデモ プログラムの 1 つは、「PsychViewController」と「HappinessViewController」の 2 つの UIViewController を作成します。ターゲット アクション メソッドを使用して、PsychViewController から HappinessViewController にセグエします。

次のコードは、この例外をスローし続けます: "-[UIViewController setHappiness:]: 認識されないセレクターがインスタンスに送信されました"

問題のあるコードは次のとおりです。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"ShowDiagnosis"]) {
    [segue.destinationViewController setHappiness:7];
}
}

このサイトや他のサイトを検索しましたが、通常、このエラーが発生するのは、汎用の UIViewController が、プログラムで使用される特定のビュー コントローラー オブジェクト (この場合は「HappinessViewController」) に正しく設定されていないためです。しかし、IB の ID インスペクターを使用して汎用 UIViewController を HappinessViewController に設定しましたが、まだ例外が発生しています。誰かがそれを助けることができれば、私は髪を引き裂いています。

4

8 に答える 8

19

例外を見てみましょう:

-[UIViewController setHappiness:]: unrecognized selector sent to instance

これにより、認識されなかったメッセージについて 2 つのことがわかります。セレクターを教えてくれますsetHappiness:。また、レシーバーの実際の実行時クラスも示しますUIViewController

もちろん、UIViewControllerには という名前のメソッドはありませんsetHappiness:。それがあなたが例外を得た理由です。

メソッド (またはメソッドを生成するという名前の読み取り/書き込みプロパティ) を持つ、UIViewControllercalledのサブクラスHappinessViewControllerを作成しました。そして、レシーバー (宛先ビュー コントローラー) をそのサブクラス ( ) のインスタンスにするつもりでした。setHappiness:happinessHappinessViewController

ただし、例外は、宛先のView Controllerが単なるプレーンであることを示していますUIViewController。したがって、設定したと思っていても、ビュー コントローラーのカスタム クラスをストーリーボードに設定していない可能性があります。他のビュー コントローラーのカスタム クラスを設定した可能性がありますが、このセグエの宛先のクラスを設定していません。

次のように、Identity Inspector で宛先ビュー コントローラーのカスタム クラスを設定する必要があります。

ID インスペクタでカスタム クラスを設定する

于 2012-11-01T03:32:54.420 に答える
7

私は問題を理解しました。関連する UIViewController が HappinessViewController であることを正しく指定していましたが、リンカーは何らかの理由で正しいファイルにリンクしていませんでした。修正は、Xcode 内の .xcodeproj ファイルをダブルクリックしてから、[ビルド フェーズ] に移動し、[ソースのコンパイル] の下にファイルを手動で追加することでした。

于 2012-11-01T20:20:05.860 に答える
4

ストーリーボードでView Controllerのクラスを変更するとうまくいきました。ここに画像の説明を入力

于 2014-07-16T08:06:10.943 に答える
1

このようにしてみてください:

HappinessViewController *controller = segue.destinationViewController;
[controller setHappiness:7];
于 2012-11-01T03:19:27.867 に答える
0

キャストを追加しようとしましたが、うまくいきましたが、同じ問題がありました:

 FirstViewController *detailViewController =
    (FirstViewController *)[segue destinationViewController];
于 2015-04-12T19:00:34.357 に答える
0

今日も同じ問題がありましたが、それはカスタム クラスがライブラリにあったためです。ライブラリ自体はビルド フェーズでリンクされていましたが、それだけではクラスをプルするには不十分でした。最後に、次の行を AppDelegate に追加して解決しました。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   [ CustomClass class ];
}

これにより、リンカは強制的にクラスを取り込みます。そうしないと、アプリケーションのどこかでクラスが参照されない限り、単にライブラリにリンクするだけでは、クラスをプルするのに十分ではない可能性があります。

于 2014-12-09T06:23:19.623 に答える
-1

割り当てる前にキャストする

HappinessViewController *controller = (HappinessViewController *)segue.destinationViewController;
[controller setHappiness:7];

ストーリーボードで、HappinessViewController が VC のクラスとして設定されていることを確認してください。

于 2013-05-13T19:36:42.527 に答える