0

プログラムの目標: viewController に数字を入力します。ユーザーが送信ボタンを押すと、ユーザーが入力したデータは別のクラスに渡され、別のビューコントローラーに表示されます。

numberList問題:インスタンス メソッド ( ) 内のインスタンス変数 ( ) にアクセスしようとしています-(void)insertNewNumber:(Numbers *)tempNumberが、正しい出力が得られません。しかし、 のプロトコル メソッドを介して同じ変数にアクセスするとUITableViewDataSource、正しい答えが得られます。インスタンスメソッドとプロトコルメソッドで NSLog を使用してこれを理解しました。

numberList変数として宣言しているのでproperty、プログラムのどこからでもアクセスでき、そこに格納されている正しい値を取得できると考えていました。ただし、コンパイラは0、インスタンス メソッドから呼び出されたときに NSLog ステートメントに対して返されました。プロトコル メソッドからの NSLog ステートメントが正しい結果を示した場合。

これが発生する理由と、プログラム内の任意のメソッドから配列に要素を追加する方法を理解するのを手伝ってください。

ありがとうございました!

私が取り組んでいる関連コードは次のとおりです。

Numbers.h:

@interface Numbers:NSObject

@property (strong, retain) NSString *ID;
@property (strong, retain) NSInteger *number;

@end

Numbers.m

@implementation Numbers

@synthesize ID, number;

@end

DisplayNumbers.h

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

@interface DisplayNumbers : UIViewController <UITableViewDataSource, UITableViewDelegate>

@property (strong, nonatomic) NSMutableArray *numberList;

- (void)insertNewNumber:(Numbers *)tempNumber;

@end

DisplayNumbers.m:

@implementation DisplayNumbers

@synthesize numberList;


- (void)viewDidLoad
{
    [super viewDidLoad];

    numberList = [[NSMutableArray alloc] init]; 

    Numbers *num0 = [[Numbers alloc] init];
    Numbers *num1 = [[Numbers alloc] init];

    num0.ID = [NSString stringWithFormat:@"ID 0"];
    num0.number = 1111111111;

    num1.ID = [NSString stringWithFormat:@"ID 1"];
    num0.number = 2222222222;


    [numberList addObject:num0];    
    [numberList addObject:num1];    

}

- (void)insertNewNumber:(Numbers *)tempNumber
{
    NSLog(@"numberList.count (in -(void)insetNewNumber) = %d", numberList.count);
    [numberList addObject:tempNumber];
    NSLog(@"numberList.count (in -(void)insetNewNumber) = %d", numberList.count);
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"numberList.count (in -(NSInteger)tableView:...) = %d", numberList.count);            
    Numbers *temp = [[Numbers alloc] init];
    temp.ID = @"hi";
    temp.Number = 1234;

    [numberList addObject:temp];

    NSLog(@"numberList.count (in -(NSInteger)tableView:...) = %d", numberList.count);                
   return numberList.count;
}

@end

編集 1: の呼び出しinsertNewNumber:。このメソッドは別のクラスから呼び出されています。

InputNumber.h:

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

@interface InputNumber:UIViewController

@property (retain, strong) NSInteger *enteredNumber;
-(void)enteredNumber;

@end

入力番号.m

@implementation InputNumber

@synthesize enteredNumber;
-(void)enterNumber
{
    DisplayNumber *temp = [[DisplayNumber alloc] init];
    [temp insertNewNumber:enteredNumber];
}
@end   
4

2 に答える 2

0

メソッドにnumberListを割り当てるので、を呼び出したViewDidLoadに必ずinsertNewNumberメソッドを呼び出してください。ViewDidLoad

私は信じている

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    Numbers *temp = [[Numbers alloc] init];
    temp.ID = @"hi";
    temp.Number = 1234;
    [self insertNewNumber:temp];
   return contactList.count;
}

動作しますよね?

insertNewNumberを呼び出す前にメソッドを呼び出す必要がある場合はViewDidLoad、numberListを割り当てます

numberList = [[NSMutableArray alloc] init]; 

オーバーロードされたinitWithNibName:bundle:メソッドで。

于 2012-10-01T17:54:01.840 に答える
0

コードに という ivar がありませんnumberList。次のようにプロパティを呼び出す必要があります。

self.numberList = [NSMutableArray array];

すでに強い参照を使用しているため、割り当て/初期化する必要はありません。

そのオブジェクトを参照するたびにnumberList、 を使用する必要がありますself.numberList

[self.numberList addObject:num0];
[self.numberList addObject:num1];
于 2012-10-01T17:58:33.450 に答える