Проблема разработки кода модели представления Xcode (MVC) - PullRequest
1 голос
/ 24 октября 2011

Я читал множество книг по разработке для iPhone и делал примеры, но я заметил, что идея MVC действительно не преподается правильно (хотя авторы действительно говорят, что Xcode «поддается» способу кодирования MVC).

Быстрый пример. Я хочу сделать простое приложение калькулятора (как многие, кто только начинает).

У меня есть рабочая версия со всем моим кодом внутри файла xxxxxViewController.m. Акции и розетки все работают хорошо. Проблема с этим подходом состоит в том, что если я хочу иметь несколько представлений (обычный калькулятор и научный калькулятор), я бы скопировал и вставил свой код, поэтому у меня теперь есть две версии. Я явно пытаюсь избежать этого.

Итак, я создал свой собственный класс (на основе NSObject) в качестве моего CalculatorEngine.

Проблема в том, что при попытке выделить и инициализировать мой CalculatorEngine я получаю ошибки, такие как «Переопределение CalculatorEngine с другим типом» и «Отсутствует спецификатор типа, по умолчанию используется int».

Полагаю, мне не хватает чего-то очевидного.

Можете ли вы указать мне направление выборки любого вида, где отдельный класс используется в качестве «движка», а не кода внутри xxxxViewController?

На этом этапе приведенный ниже код фактически ничего не делает. Я просто пытаюсь получить объект CalculatorEngine для использования в CalculatorViewController.m. Здесь я получаю сообщение об ошибке.

//  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

Ответы [ 2 ]

1 голос
/ 24 октября 2011

Этот код находится в неправильном месте:

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

Поместите это в -(void)viewDidLoad.

ОБНОВЛЕНИЕ Вы не можете вызвать свой метод, потому что ваш контроллер представленияне хранить ссылку на CalcEngine (кстати, переменные, подобные этой, должны быть верблюжьими, чтобы соответствовать соглашениям об именах, поэтому это будет calcEngine).Чтобы сохранить ссылку, вам нужно добавить iVar, или, более подходяще, свойство CalcEngine.Для этого заголовок CalculatorViewController должен выглядеть следующим образом:

//  CalculatorViewController.h
//  Calculator

#import <UIKit/UIKit.h>

@interface CalculatorViewController : UIViewController {
   CalculatorEngine *CalcEngine;
}

@property (retain) CalculatorEngine *CalcEngine;
@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
{
    CalcEng = [[CalculatorEngine alloc] init];
    [super viewDidLoad]
}

- (void)didReceiveMemoryWarning
{
}

- (void)viewDidUnload
{
}

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

@end

Не поймите это неправильно, но вы должны потратитьНекоторое время читал Справочник Apple's Objective C .Проблемы, которые у вас есть, не имеют ничего общего с MVC, но с целью-c.

0 голосов
/ 24 октября 2011

Ты?

@class CalculatorEngine;

а нет?

#import "CalculatorEngine.h"
...