1

これはObjective-cの問題です。パラメータ「height」と「weight」を使用してNSObjectのサブクラスpersonを作成し、プロパティを使用して、インターフェイスと実装の両方を含むPerson.hというファイルに合成しました。

Person.hをviewcontroller.mにインポートし、personオブジェクトを作成し、2つのIBActionを使用してそれらを変更したいと思います。

-(IBAction)alterperson_1{

 person *bob = [person alloc]init];
 bob.height = 72;
 bob.weight = 200;
}

-(IBAction)alterperson_2{

 bob.height = 80;
 bob.weight = 250;

}

メソッドalterperson_2は、alterperson_1のローカル変数であるため、Bobを見つけることができないため、この配置は機能しません。私の質問は、viewcontroller.mのどこでどのようにボブを人として割り当て、両方のIBActionによって彼の属性を変更できるようにするかです。

viewdidloadとinitwithnibnameメソッドで割り当てを試しました。それは動かなかった。viewcontroller.mの実装{}も試しましたが、Bobの割り当てがコンパイル時定数ではないため、これも機能しません。

ありがとう!

コードで更新

したがって、Person.hファイルを正しくインポートし(Robotnikに感謝)、ViewController.m全体でPersonのインスタンスを作成できます-ただし、作成したインスタンス* bobは、そのプロパティの値を保持していないようです(コメントを参照)コード内のNSLogステートメントによる)。これは初期化の問題だと思いますが、どこで初期化するのかわかりません。現在、viewDidLoadで初期化すると警告が表示されます。IBActionが呼び出されたときに、現在取得している0ではなくbob.weightを取得して200を出力するにはどうすればよいですか?ありがとう。

// Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject{

int weight;
int height;
}

@property int weight, height;

@end

終了Person.h

//Person.m


#import "Person.h"

@implementation Person

@synthesize weight, height;

@end

終了Person.m

//ViewController.h

#import <UIKit/UIKit.h>
#import "person.h"



@interface ViewController : UIViewController{


}

@property Person *bob;

-(IBAction)persontest:(id)sender;

@end

ViewController.hを終了します

//ViewController.m

#import "ViewController.h"

@implementation ViewController

@synthesize bob;

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

    Person *bob = [[Person alloc]init]; // this causes a local declaration warning, if I remove this code, however, it still doesn't work
    bob.weight = 100;
    NSLog(@"viewDidLoad bob's weight, %i", bob.weight); // this will print 100, but only because I made the local initialization. The value is lost once the viewDidLoad Method ends.
}

-(IBAction)persontest:(id)sender{

    bob.weight = bob.weight + 100;
    NSLog(@"IBAction bob's weight %i", bob.weight); // this prints 0, probably because value is nil. How can I make it print 200?
}

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

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

@end

ViewController.mを終了します

4

2 に答える 2

1

ViewController.h複数のメソッドからボブにアクセスできるようにする場合は、ボブを宣言する必要があります。その後、viewDidLoadで彼を初期化できます

@interface ViewController
{
    Person *bob;
}

-(IBAction)alterperson_1;
-(IBAction)alterperson_2;
@end

複数の人をインスタンス化したいとおっしゃいました。その場合、複数のPersonオブジェクトをNSMutableArrayまたは同様のものに保持することをお勧めします。ViewController.h複数のメソッドでアクセスできるようにするには、これをで宣言する必要があります。次に、このメソッドを使用しaddObject:て、配列に人を追加できます。文字列を格納する配列の例を次に示します。

NSMutableArray *stringArray = [[NSMutableArray alloc] init];

[stringArray addObject:@"Dog"];
[stringArray addObject:@"Cat"];
于 2012-06-06T02:01:48.977 に答える
1

変数の宣言と変数の割り当てを混同しているようです。また、プロパティを適切に使用していません。

変数の宣言は次のように行われます。

Person *bob;

それでおしまい。この行を@interfaceセクション、または実装セクションの上部にある{braces}に配置すると、これはインスタンス変数bobになります。クラスの残りの部分で使用するときはいつでも、人。したがって、viewDidLoadで、これを実行できます。

bob = [[Person alloc] init];

そして、それはあなたがインスタンス変数を参照していることを知っています。現在のコードではPerson *、この行の前にあります。これは、コンパイラーが指示しているように、bobという名前のローカル変数を宣言しているため、インスタンス変数を非表示にしているため、インスタンス変数をまったく変更していません。したがって、後で値はありません。

この質問の性質とあなたのコメントを見て、先に進む前に、Objective-cの紹介テキストを読むことを強くお勧めします。ここで質問することはできますが、SOは実際には言語を学ぶ場所ではありません。ほとんどの回答者は、あなたが言語の基本を知っていると想定します。

于 2012-06-07T05:58:10.357 に答える