0

私は次のようにdot-mファイル内に「decisionText」のラベルコードを持っています:

@synthesize decisionText ;  //<<<This generates the error 

dot-hファイル内では、コードは次のように記述されています。

IBOutlet UILabel *decisionText 

私が得るエラーは次のとおりです:インターフェースにプロパティの宣言が見つかりません'decisionText。

ps:Interface Builderでラベルをクリックすると、ファイルの所有者にマップされた参照アウトレットの下に「decisionText」という名前が表示されます。

これで立ち往生。:(


提案されたように、私は行@synthsizedecisionTextを削除して使用しました:

@property (nonatomic,weak) IBOutlet UILabel *decisionText ; 

今、私はエラーを受け取ります:'weak'の前にプロパティ属性が必要です


ドットMファイル:

#import "ClickButtonViewController.h"

@implementation ClickButtonViewController;



//@synthesize decisionText ; 
@property (weak,nonatomic) IBOutlet UILabel *decisionText ;

-(IBAction)buttonPressed:(id)sender 
{
    decisionText.text = @"Go for it!" ;
}

-(void)dealloc{
    [decisionText release];
    [super dealloc] ; 

}



- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}




@end
4

5 に答える 5

1

宣言されたプロパティ@synthesizeを持つステートメントを使用します。したがって、コードはおそらく次のようになります。

@interface ViewController : UIViewController
{
    // your ivars go here

    // but this is not needed:
    //
    // IBOutlet UILabel *decisionText;
}

// your properties go here

@property (nonatomic, retain) IBOutlet UILabel *decisionText;

@end

ARCを使用している場合は、に置き換えretainweakください。

そして、.mファイルには次のようになります。

@implementation ViewController

@synthesize decisionText = _decisionText;

// and your implementation goes here

ノート:

  1. インスタンス変数を明示的に宣言することはできますが、それを省略すると、@synthesizeステートメントによってインスタンス変数が作成されます。したがって、インスタンス変数を明示的に宣言する必要はありません。実際、インスタンス変数を明示的に宣言するべきではないと主張するかもしれません。タイプミスがある場合、明示的に宣言したインスタンス変数とコンパイラが生成するインスタンス変数の2つのインスタンス変数が誤って発生する可能性があるからです。私はここStackOverflowでその問題を何度も見ました。したがって、私の例では、明示的なインスタンス変数宣言を省略し、コンパイラに処理させて、エラーの可能性を最小限に抑えます。

  2. 必須ではありませんが、@synthesizeステートメントでプロパティのインスタンス変数に別の名前を指定することをお勧めします(たとえば、この場合、プロパティdecisionTextのインスタンス変数は_decisionText)です。これは、プロパティのゲッターまたはセッターを呼び出すことを意図したときに、インスタンス変数を誤って参照することを防ぐのに役立ちます。(実際、Xcode 4.4以降では、@synthesizeステートメントを省略すると、コンパイラーは先頭にアンダースコアを付けてインスタンス変数を自動的に合成します。)したがって、コードでは、プロパティself.decisionTextまたはインスタンス変数を参照します。 _decisionText。通常、オブジェクトにとってはそれほど重要ではありませんIBOutletが、独自のカスタムプロパティを使い始めると、この規則が役立ちます。

于 2012-09-21T11:37:38.937 に答える
1

.hファイルに次を追加します。

@interface ViewController : UIViewController
{
     //....
     IBOutlet UILabel *decisionText ;
     //...
 }

@property (nonatomic, retain) IBOutlet UILabel *decisionText ;
//...
@end

次に、.mファイルに次を追加します。

@synthesize decisionText ; 
于 2012-09-21T11:41:28.070 に答える
0

変化する

IBOutlet UILabel *decisionText 

@property (nonatomic, weak) IBOutlet UILabel *decisionText 

@propertyキーワードを使用して、そのように定義したプロパティのみを合成できます

于 2012-09-21T11:36:54.513 に答える
0

または、Xcode 4.4を使用している場合は、自動合成を使用できます。

この場合、iVarを宣言する必要はなく、次のように記述できます。

@property (weak, nonatomic) IBOutlet UILabel *decisionText;

また、@sythesize行を記述する必要はまったくありません。

これを行う場合は、生成されたiVarにデフォルトで先頭のアンダースコアが追加されることに注意してください。ただし、この場合はプロパティアクセサーの使用に固執する必要があるため、ほとんど違いはありません。

Objective-Cの機能可用性インデックスで何ができるかを確認できます

于 2012-09-21T11:39:32.607 に答える
0

プロパティのコンテンツを格納するインスタンス変数のみを宣言しましたが、プロパティ自体は宣言していません。これを解決する最も簡単な方法は、パブリックインターフェイス(.hファイル)またはプライベートインターフェイス(@interface ClassName()... @end in ClassName.mファイル)にプロパティの宣言を追加することだと思います。

ClassName.h

@interface ClassName : ParentClass
@property (nonatomic, weak) IBOutlet UILabel decisionText; //This is the declaration of the property than you can ctrl-drag to wire it up to your label
@end

ClassName.m

@implementation ClassName

@synthesize decisionText = _decisionText //the _decisionText stuff is the name of the instance variable that will store the content of your property

... //your methods

@end
于 2012-09-21T11:53:09.943 に答える