2011-10-24 4 views
1

저는 iPhone 개발 및 예제에 대한 책을 많이 읽었지만 실제로 MVC가 제대로 가르쳐지지 않는다는 것을 알았습니다. (저자는 Xcode가 " 그 자체를 "MVC 코딩 방식으로 변환).Xcode 개발 MVC (Model-View-Controller) 문제

빠른 예. 나는 간단한 계산기 앱을 만들기를 원한다.

xxxxxViewController.m 파일 안에 모든 코드가 포함 된 작동 버전이 있습니다. 액션과 아웃렛이 모두 잘 작동합니다. 이 접근 방식의 문제점은 여러 개의 뷰 (일반 계산기와 공학용 계산기)를 갖고 싶으면 코드를 복사하여 붙여 넣으면서 두 가지 버전을 사용할 수 있다는 것입니다. 나는 이것을 피하려고 분명히 노력하고있다.

그래서 저는 CalculatorEngine으로 자신의 클래스 (NSObject 기반)를 만들었습니다.

CalculatorEngine을 할당하고 초기화하는 데 문제가 있습니다. "다른 유형의 CalculatorEngine 재정의"및 "유형 지정자가없는 경우 기본값은 int"와 같은 오류가 나타납니다.

나는 분명히 뭔가 빠져있는 것 같아.

xxxxViewController 안에 코드가있는 대신 별도의 클래스가 "엔진"으로 사용되는 샘플의 방향으로 나를 가리킬 수 있습니까?

이 시점에서 아래 코드는 실제로 아무 것도하지 않습니다. CalculatorViewController.m에서 사용할 수있는 CalculatorEngine 객체를 가져 오려고합니다. 이것이 내가 오류를받는 곳입니다.

// CalculatorAppDelegate.h 
// Calculator 

#import <UIKit/UIKit.h> 

@class CalculatorViewController, CalculatorEngine; 

@interface CalculatorAppDelegate : NSObject <UIApplicationDelegate> 

@property (nonatomic, retain) IBOutlet UIWindow *window; 

@property (nonatomic, retain) IBOutlet CalculatorViewController *viewController; 

@end 




// CalculatorAppDelegate.m 
// Calculator 

#import "CalculatorAppDelegate.h" 

#import "CalculatorViewController.h" 

@implementation CalculatorAppDelegate 

@synthesize window = _window; 
@synthesize viewController = _viewController; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
} 

- (void)applicationWillResignActive:(UIApplication *)application 
{ 
} 

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
} 

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
} 

- (void)dealloc 
{ 
} 

@end 




// CalculatorViewController.h 
// Calculator 

#import <UIKit/UIKit.h> 

@interface CalculatorViewController : UIViewController 

@end 




// CalculatorViewController.m 
// Calculator 

#import "CalculatorViewController.h" 
#import "CalculatorEngine.h" 

@implementation CalculatorViewController 

// This was wrong here. Now moved to viewDidLoad(). 
//CalculatorEngine *CalcEng; 
//CalcEng = [[CalculatorEngine alloc] init]; 

// trouble here. CalcEng is unknow. 
-(IBAction)buttonPressed:(id)sender { 
    [CalcEng setRegisterX:1]; 
} 

- (void)viewDidLoad 
{ 
    CalculatorEngine *CalcEng; 
    CalcEng = [[CalculatorEngine alloc] init]; 
    [super viewDidLoad] 
} 

- (void)didReceiveMemoryWarning 
{ 
} 

- (void)viewDidUnload 
{ 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
} 

@end 




// CalculatorEngine.h 
// Calculator 

#import <Foundation/Foundation.h> 

@interface CalculatorEngine : NSObject 

@end 




// CalculatorEngine.m 
// Calculator 

#import "CalculatorEngine.h" 

@implementation CalculatorEngine 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     // Initialization code here. 
    } 

    return self; 
} 

@end 
+0

이것은 Objective-C 질문입니다. iPhone과 관련이 없습니다. "유형 지정자가 누락되어 기본값이 int"인 부분은 누락 된 포함과 같습니다. 코드를 게시하거나 적어도 메소드 안에 코드를 남기지 않는 뼈대를 게시하십시오. –

+0

샘플 코드가 원래 게시물에 포함되었습니다. – David

답변

1

이 코드가 잘못된 위치에 있습니다

CalculatorEngine *CalcEng; 
CalcEng = [[CalculatorEngine alloc] init]; 

넣어 -(void)viewDidLoad에.

보기 컨트롤러는 방법으로합니다 (CalcEngine에 대한 참조를 유지하지 않기 때문에 당신은 당신의 방법을 호출 할 수 없습니다 UPDATE,이 같은 변수 명명 규칙에 맞춰 계속 맡았다 낙타해야한다, 그래서 calcEngine 것). 참조를 유지하려면 iVar 또는 더 적절하게 CalcEngine이라는 속성을 추가해야합니다. 이렇게하려면 CalculatorViewController 헤더는 다음과 같이 보일 것이다 :이 길을 잘못하지 마십시오

// CalculatorViewController.m 
// Calculator 

#import "CalculatorViewController.h" 
#import "CalculatorEngine.h" 

@implementation CalculatorViewController 

// This was wrong here. Now moved to viewDidLoad(). 
//CalculatorEngine *CalcEng; 
//CalcEng = [[CalculatorEngine alloc] init]; 

// trouble here. CalcEng is unknow. 
-(IBAction)buttonPressed:(id)sender { 
    [CalcEng setRegisterX:1]; 
} 

- (void)viewDidLoad 
{ 
    CalcEng = [[CalculatorEngine alloc] init]; 
    [super viewDidLoad] 
} 

- (void)didReceiveMemoryWarning 
{ 
} 

- (void)viewDidUnload 
{ 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
} 

@end 

을하지만 Apple's Objective C guide을 읽는 시간을 보낼해야합니다

// CalculatorViewController.h 
// Calculator 

#import <UIKit/UIKit.h> 

@interface CalculatorViewController : UIViewController { 
    CalculatorEngine *CalcEngine; 
} 

@property (retain) CalculatorEngine *CalcEngine; 
@end 

귀하의 구현은 다음과 같을 것 . 당신이 가지고있는 문제는 MVC와 관련이 없지만 objective-c와는 관련이 있습니다.

+0

그 트릭을 한 것으로 보인다. 고맙습니다. :-) – David

+0

그건 내가 컴파일하는 것을 허용했다. 그러나 지금 CalculatorViewController.m에서 내 클래스의 메서드를 호출하려고 할 때 "선언되지 않은 식별자 사용"오류가 발생합니다. 메소드를 호출하려고하는 방법을 보여주기 위해 원본 게시물의 코드를 업데이트합니다. – David

+0

내 대답이 업데이트되었습니다. – sosborn

0

봤습니까?

@class CalculatorEngine; 

아니요?

#import "CalculatorEngine.h" 
+0

샘플 코드가 원래 게시물에 포함되었습니다. – David