2

항상 내 AppController 개체 내에서 모 놀리 식 코드 블록을 실행 한 후에는 별도 모델 컨트롤러 개체를 사용하여 코드를 모듈화하는 방법을 배웠습니다. :-))NSTextField 모델 컨트롤러 개체에서 쓸 수 없습니다.

간단한 테스트 응용 프로그램에는 기본 AppController와 두 개의 모델 객체 (Model1 및 Model2)가 있습니다. AppController에서 모델로 데이터를 성공적으로 전달할 수 있으며, 모델 자체가 메소드를 실행하고 전달 된 데이터를 '내부적으로'의도 한대로 처리 할 수 ​​있습니다.하지만 모델에서 전달 된 데이터를 처리하도록 NSTextField를 전달할 수는 없습니다. UI. 여기에 내 코드의 관련 부분입니다 : AppController.m에서

는 Model2.h # import를

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

@end 

에서 "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 

을 ... # import를 ... 그리고 마지막으로 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 

두 모델 OBJ에서 요법에는 일반적인 NSTextField에 대한 콘센트가 있으며 두 개체에서 필드로 컨트롤을 드래그하여 연결했습니다. 내 AppController NSTextField에 대해 알고 있지 않습니다 (그리고 나는 알고 싶지도 않습니다). 컨트롤러 개체와 모델 개체간에 IB 연결이 이루어지지 않았습니다.

NSLog는 모델 객체가 생성되고 있으며, 전달 된 값으로 GUI 윈도우의 텍스트 필드에 멀리 있지만 그곳으로 가도록 지시합니다. 나는 어떤 컴파일러 에러 나 경고도 얻지 못한다. 아마도 'setTarget :'이라는 어떤 종류의 호출이 누락 되었습니까?

도움/아이디어를 많이 주시면 감사하겠습니다. 감사 :-)

답변

2

mihirsm에 언급 된 MVC가 부족한 것 외에도 실제 문제는 -init 방법으로 콘센트에 액세스하려고한다는 것입니다.

개체가 초기화 될 때 콘센트가 연결되지 않을 수도 있습니다.

콘센트로 선언 된 NSTextField의 값을 설정하려면 -awakeFromNib을 구현해야합니다.이 값은 펜촉이로드되고 모든 콘센트가 라이브로 보장 될 때 호출됩니다.

1 모델 1.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]; 
} 

@end

+1

G'day from Adelaide, Rob :-). 네, 지금 이걸 가지고 있습니다, 도움을 많이 주셔서 감사합니다. – Bender

+0

그냥'-init' 메쏘드에서 콘센트에 접근하여 잡았습니다 .. 나를 구해 주셔서 감사합니다. – Ian

1

컨트롤러는 모델과보기 사이에 위치합니다. 모델은보기와 통신해서는 안됩니다.

들어오는 값을보기에서 모델로 전달하는 것이 컨트롤러의 역할이어야합니다. 그런 다음 모델은 데이터를 처리하고 Controller로 다시 보내고 View는 새로운 데이터로 View를 업데이트합니다.

그래서 코드에서 AppController에 선언 된 TexField에 대해 하나의 IBOutlet 만 가져야합니다.

이 모든 것을 감안할 때 TextField가 업데이트되지 않는 이유가 정확히 무엇인지 모르겠습니다. 주어진 코드에서 볼 수있는 것처럼 보입니다. 멀티 폴 IBOutlets가 어떤 문제를 일으키고 있습니까? IBOutlet이있는 모델 하나만 사용해 볼 수 있습니까?

+0

감사합니다. mihirsm. 저는 모듈화에 착수했을 뿐이므로 Model-View-Controller 개념의 속도를 100 % 높일 수는 없습니다. 그러나 내 테스트는 컨트롤러와 2 개의 모델 객체를 사용하는 Apple의 "SimpleCocoaApp"예제와 거의 동일합니다. 컨트롤러는 모델에 문자열을 보내고 모델 (컨트롤러가 아닌)은 문자열을 직접 textField에 씁니다. 그들의 컨트롤러는 필드에 연결되어 있지 않습니다 - 단지 두 개의 모델 객체 만 있습니다 (내가하는 것처럼). 유일한 차이점은 'setTarget'을 통한 데모 보내기이고 하나 이상의 매개 변수에 대해서는 'initWithStuff'를 사용하고 있습니다. – Bender

+0

또한 (1) 모델 중 하나만 IBOutlet에 연결하고, (2) 두 모델에서 콘센트를 빼고 컨트롤러 자체에 콘센트를 추가하고 (3) textField에서 setFirstResponder를 호출하여 포커스 문제 일 수 있다고 생각한 후, 그러나 행운은 아직 불행히도 :-( – Bender

0

CORRECTION : 난 주제어 객체는 두 모델 중 하나에 연결되지 않았 음을 상기 사물. 죄송합니다. 잘못된 것입니다 !! 사실 컨트롤러는 두 모델에 매장을 가지고 있으며, AppController가의 헤더는 이제 다음과 같습니다

#import <Cocoa/Cocoa.h> 
#import "Model1.h" 
#import "Model2.h" 

@interface AppController : NSObject 
{ 
// points to the Model1 object 
IBOutlet Model1 *ObjController1; 
// points to the Model2 object 
IBOutlet Model2 *ObjController2; 
} 
- (IBAction)callController:(id)sender; 
- (IBAction)passObjectsToController:(id)sender; 

@end 

연결

는 IB 이루어지고있다 (그리고 'passObjectsToModelController'의 로컬 선언이 너무로를 숨길 수 없습니다 수정되었습니다 이전에 선언 된 인스턴스 변수) 그러나 아직 textField에 결과가 없습니다.

+0

그래, 제 대답에 설명 된대로'-awakeFromNib'을 구현해야합니다. –

관련 문제