1

IO で最初のテスト アプリを作成しようとしていますが、何をしてもそのエラーが発生します。私はxcode 4.4を使用しています。

アプリはとてもシンプルです。ボタンがあり、押すとラベルとイメージビューが表示されます。

私のコード全体はこれです:

ViewController.h


//
//  ViewController.h
//  helloWorld_04
//
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController{

    IBOutlet UILabel *label;
    IBOutlet UIImageView *Kant;
}
@property (nonatomic, retain) IBOutlet UILabel *label;
@property (nonatomic, retain) IBOutlet UIImageView *Kant;
- (IBAction)buttonGuess:(id)sender;

@end

そして私の実装ファイル:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize label,Kant;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}



- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (void)dealloc {
    [label release];
    [Kant release];
    [super dealloc];
}
- (IBAction)buttonGuess:(id)sender {
    label.text=@"Hello World i am back!";
    UIImage *imageSource=[UIImage imageNamed:@"kantStair.png"];
    Kant.image=imageSource;
}
@end

私のエラーログはこれです:

2012-08-23 13:38:50.030 helloWorld_04[537:c07] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<ViewController 0x6a5e1f0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key image.'
*** First throw call stack:
(0x14b2022 0xeb2cd6 0x14b1ee1 0x9c3022 0x934f6b 0x934edb 0x94fd50 0x23771a 0x14b3dea 0x141d7f1 0x23626e 0xdc1fc 0xdc779 0xdc99b 0x3b401 0x3b670 0x3b836 0x4272a 0x2d1b 0x13386 0x14274 0x23183 0x23c38 0x17634 0x139cef5 0x1486195 0x13eaff2 0x13e98da 0x13e8d84 0x13e8c9b 0x13c65 0x15626 0x2a22 0x2995)
terminate called throwing an exception(lldb) 

そして、その行にその信号が表示されます:

//
//  main.m
//  helloWorld_04
//

//

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

ここでいくつかの回答を読みましたが、問題の解決策が見つからなかったため、新しい質問にしました。接続に問題があるのではないかと思ったので、自分でラベルと画像を「ファイルの所有者」に「ドラッグアンドドロップ」しましたが、それでもエラーが発生しました。

4

2 に答える 2

3

エラーメッセージを見ると、Interface Builderで定義されているものがあるように見えますがimage、存在しません。たとえば、次のようなものがあるかもしれません。

サンプルIB画面

imageしかし、あなたは財産を持っていません。昔々持っていましたか、おそらく名前を変更しましたKantか?Interface Builderでこのようなものを定義している場合は、それを削除し(強調表示したアウトレットの横にある「x」をタップして)、新しいコントロールに再度リンクします。


アップデート:

上記のバグを確実に修正する必要があります。上記の観察結果がバグの発見に役立つことを願っています。コードにバグはありませんが、問題は間違いなくInterfaceBuilderのリンケージにあります。

しかし、そうは言っても、もしあなたが新しいプログラマーなら、私はあなたがいくつかの一方的な文体の観察を気にしないことを望みます。明らかに、それはスタイルの問題であることを考えると、これらは議論の余地がありますが、これらはすべて、確立された、または新しいiOSコーディング標準のいずれかを表していると思います。とにかく、私は将来的にそれを提案するかもしれません:

  1. David Hが提案したように、小文字の変数名を使用する必要があります。

  2. おそらく、、またはXcode 4.4以降を使用している場合は、ステートメントを完全に省略した@synthesizeステートメントが必要です。(Interface Builderで簡単なステートメントを生成できることは知っていますが、インスタンス変数とプロパティを誤って混同しないように、一意のインスタンス変数名を使用することをお勧めします。)@synthesize label = _label@synthesize@synthesize@synthesize

  3. Born Survivorが指摘しているようにinit、メソッド内のインスタンス変数dealloc(つまり、先頭にアンダースコアが付いた変数名)を参照し、他の場所ではプロパティ(先頭に付いた)を使用する必要があります。self.

  4. おそらく、インスタンス変数を省略して、@synthesizeステートメントにこれらを実行させる必要があります(タイプミスをした場合に、誤って2つのインスタンス変数になってしまうことがないようにするため)。

したがって、コードは次のようになります。

//  ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

// note, no braces with instance variables defined
// once upon a time that was recommended by Apple, but no longer
// just let the following @property statements and the subsequent
// @synthesize statement generate the instance variables for you.

@property (retain, nonatomic) IBOutlet UIImageView *kant; // note the lower case "k"
@property (retain, nonatomic) IBOutlet UILabel *label;

- (IBAction)buttonGuess:(id)sender;

@end

//  ViewController.m

#import "ViewController.h"

@implementation ViewController

@synthesize label = _label;  // note the @synthesize statement let's us define what the instance variable name should be, _label in this case
@synthesize kant  = _kant;

- (void)viewDidUnload
{
    [self setKant:nil];
    [self setLabel:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (void)dealloc {
    [_kant release];  // note I'm now using the instance variables that begin with the underscore
    [_label release];
    [super dealloc];
}

- (IBAction)buttonGuess:(id)sender
{
    self.label.text = @"Hello World i am back!";  // note, I'm using the properties with the preceding "self."
    UIImage *imageSource = [UIImage imageNamed:@"kantStair.png"];
    self.kant.image = imageSource;
}

@end
于 2012-08-23T15:55:19.983 に答える
0

ObjectiveCでは、変数に常に小文字で名前を付けることが重要です。「foo」のような変数を合成すると、「-(id)foo; //getter」と「-(void)setFoo:(id)」が得られるためです。 val;//セッター」。セッターが大文字をどのように使用するかをご覧ください。したがって、最初にすべきことは、「カント」の名前を「カント」に変更することです。[慣例により、クラスのみに頭文字が大文字であるため、慣例に従って、私のような他の人がコードを読むのを助けてください。]

したがって、最初に行うことは、「Kant」を「kant」に変更してから、Interface Builderビューに戻り、新しく名前が付けられた変数をUIImageViewに再配線することです。

それでも問題が解決しない場合は、「カント」が配線されているか、他の奇妙なことが起こっています。画像を設定する直前に、次のコード行を追加してください。

NSLog(@"kant has class %@", NSStringFromClass([kant class]) );

そしてそれが実際に何であるかを見てみましょう。

于 2012-08-23T11:49:31.637 に答える