1

さまざまなView Controllerがデータにアクセスするデータと変数を保持するためのmodel.hとmodel.mがあります(MVCを使用)。問題は、変数を設定して取得しようとすると、常に0になることです。明らかに何か間違ったことをしていますが、わかりません。

これが私のmodel.hとmodel.mです(名前を変更して簡単にしました。

モデル.h

@interface modeler : NSObject
{
   int abc;
   int def;
}
@property (nonatomic,assign) int abc;
@property (nonatomic,assign) int def;

モデル.m

#import "modeler.h"
@interface modeler()
@end
@implementation modeler
@synthesize abc = _abc;
@synthesize def = _def;

それが2つの変数を設定する方法です。ここにビューコントローラーがあります。vc.h

#import "modeler.h"
@interface vcViewController : UITableViewController
@property (nonatomic,strong) modeler *datas;
@end

vc.m

@interface vcViewController ()
@end
@implementation vcViewController
@synthesize datas = _datas;

これは、vc.mでそれらを何かに設定しようとしている方法です

NSIndexPath *selectedRowIndex = [self.tableView indexPathForSelectedRow];
NSLog(@"1-%i",selectedRowIndex.row);
_datas.abc = selectedRowIndex.row;
NSLog(@"2-%i",_datas.abc);

選択した行は 2 を出力しますが、_data.abc は常に 0 です。おそらくそれのインスタンスであるため、それを呼び出していないと思いますか?簡単なヒントはありますか?

4

2 に答える 2

4

datasビュー コントローラーのプロパティ (または_datasivar) をmodelerクラスのインスタンスに設定している場所がわかりません。それが起こらない場合_datas.abcは、nil へのメッセージです。したがって、セッターとして使用しても何もせず、ゲッターとして使用すると 0 が返されます。

さらに、クラスでivar としてabcandを宣言し、同じ名前で別の ivar ( and ) を持つプロパティを宣言しています。これはほぼ間違いなく、あなたが見ている問題の原因ではありませんが、後で混乱を招くことは間違いありません. ivar を宣言しない (ディレクティブに処理させる) か、ディレクティブで ivar を指定しない(同じ名前の ivar がデフォルトで使用されるようにする) 方がよいでしょう。私は前者を好む傾向があります。defmodeler_abc_def@synthesize@synthesize

さらに、それはおそらくあなたの問題とは関係ありませんが、正当な理由がない限り、ivar の代わりに生成されたアクセサーを使用することは一般的に良いことです。(つまり、self.datasの代わりに使用しdatasます。)

于 2012-05-06T17:30:27.670 に答える
3

@synthesize ディレクティブで変数_abcおよびを使用するようにコンパイラに指示しているため、セッターはインスタンス変数および に触れません。私は正確な問題を見ていませんが、同じ名前のプロパティとインスタンス変数を持っているが、異なる ivar を使用してプロパティをバックアップすることで、自分自身やコンパイラを間違いなく混乱させています。また、最後のスニペットで行っているように、ivars に直接アクセスしないようにしてください。アクセサーを作成したので、それらを使用します。それができたら、あなたの問題は解消されると思います。_defabcdef_datas

于 2012-05-06T16:52:49.290 に答える