2

AppControllerオブジェクト内から常にモノリシックなコードブロックを実行した後、個別のモデルコントローラーオブジェクトを使用してコードをモジュール化する方法を学びました(非常にすっきりしていて、操作の混乱が少なくなります:-))

私の単純なテストアプリには、メインのAppControllerと2つのモデルオブジェクト(Model1とModel2)があります。AppControllerからモデルにデータを正常に渡すことができ、モデル自体がメソッドを実行し、渡されたデータを意図したとおりに「内部的に」処理できますが、 UI。これが私のコードの関連部分です:

AppController.mで#import"AppController.h"

@implementation AppController

- (IBAction)passObjectsToModelController:(id)sender
{
NSString *stringToPass = @"Hello from Model2 :-)";
int numToPass=12345;

Model2 *ObjController2 = [[Model2 alloc]initWithStuff:stringToPass:numToPass];
    [ObjController2 release];
}

@end

... Model2.h #import

@interface Model2 : NSObject
{
IBOutlet NSTextField *passedStringField;
}
- (id)initWithStuff:(NSString*)passedString :(int)passedNum;

@end

...そして最後にModel2.mで#import"Model2.h"

@implementation Model2

- (id)initWithStuff:(NSString*)passedString :(int)passedNum
{
if(self = [super init])
    {
    NSLog(@"now inside 'Model2' controller...");
    NSLog(@"the passed string reads: %@",passedString); //••• this works •••
    NSLog(@"the passed number is:%d",passedNum); //••• this works •••

    [passedStringField setStringValue:passedString]; //••• WTF!!... this DOESN'T work! •••
    // do something internally with passedNum here...
    }
return self;
}

@end

両方のモデルオブジェクトには共通のNSTextFieldへのアウトレットがあり、両方のオブジェクトからフィールドにコントロールドラッグして接続しました。私のAppControllerはNSTextFieldについて知りません (そして私は、知りたくもないと思います)。コントローラオブジェクトとモデルオブジェクトの間にIB接続は確立されていません。

NSLogは、モデルオブジェクトが作成されており、渡された値がそこまで到達していることを示していますが、そこからGUIウィンドウのテキストフィールドには到達していません。コンパイラのエラーや警告は表示されません。ある種の「setTarget:」呼び出しが欠落しているのでしょうか?

任意のヘルプ/アイデアをいただければ幸いです。ありがとう :-)

4

2 に答える 2

2

mihirsmが言及しているMVC の欠如は別として、実際の問題は、-initメソッドでアウトレットにアクセスしようとしていることです。

オブジェクトが初期化されると、アウトレットが接続されていることが保証されません。

宣言された の値をアウトレットとして設定する場合は、 nib がロードされ、すべてのアウトレットが有効であることが保証されたときに呼び出される をNSTextField実装する必要があります。-awakeFromNib

Model1.hで:

@interface Model1 : NSObject
{
    IBOutlet NSTextField* passedStringField;
    NSString* modelString;
}
- (id)initWithString:(NSString*)passedString number:(int)passedNum;
@end

Model1.mで:

@implementation Model1
- (id)initWithString:(NSString*)passedString number:(int)passedNum
{
if(self = [super init])
    {
    //copy the string to our ivar
    modelString = [passedString copy];
    }
return self;
}

//awakeFromNib is called when our outlet is live
- (void)awakeFromNib
{
    [passedStringField setStringValue:modelString];
}

//don't forget to release the string, because we created it using -copy
- (void)dealloc
{
    [modelString release];
}

@終わり

于 2010-01-26T05:30:12.083 に答える
1

コントローラーは、モデルとビューの間に配置されます。モデルはビューと通信してはなりません。

ビューからモデルに入力値を渡すのはコントローラーの仕事です。その後、モデルはデータを処理し、コントローラーに送り返します。コントローラーは新しいデータでビューを更新します。

したがって、コードでは、AppController で宣言された TexField に対して IBOutlet を 1 つだけ持つ必要があります。

このすべてを考えると、TextField が更新されない理由が正確にはわかりません。指定されたコードから、そうあるべきように見えます。複数の IBOutlets が問題を引き起こしているのではないでしょうか? IBOutlet を持つモデルを 1 つだけ試してみることはできますか?

于 2010-01-26T02:08:18.283 に答える