2015-05-01 1 views
0

Мне нужна помощь с использованием NSTextField и его входов/выходов.NSTextField - действия в * textField

В коде функционирования у меня есть три различных NSTextFields (в ​​какао + Obj-C) Я знаю, как CALCulate результат более целочисленных входов ...

--- AppController.h --- 
@interface AppController : NSObject { 
    IBOutlet NSTextField *firsTextField; // 1st Outlet 
    IBOutlet NSTextField *secondTextField; // 2nd Outlet 
    IBOutlet NSTextField *resultTextField; // 3rd Outlet 
} 
- (IBAction)result:(id)sender; 
@end 

--- AppController.m --- 
@Implementation AppController 
- (IBAction)result:(id)sender { 
    double first = [firstTextField doubleValue]; // set value 1st outlet 
    double second = [secondTextField doubleValue]; // set value 2nd outlet 
    double result = first + second;    // count result 
    [resultTextField setDoubleValue:result];  // set value 3rd outlet 
} 
@end 

Но в то время как я пытаюсь сделать то же самое только в один NSTextField, я не знаю, как это сделать ... Моя идея заключается в том, что процесс должен быть следующим:

  1. Установите первое число (вход)
  2. * Выберите математическую функцию «/, , -, +»(метод/действие)
  3. Установить второе целое число (вход)
  4. Результата (метод/действие) для вычисления упомянутых выше входов на основе математической функции

Но на самом деле все, что я могу объяснить ... проблема в том, что я не знаю как Я могу магазин 1-й входной (до выбора математической функции) и как до подсчет результата между 1-м и 2-м входным значением.

Спасибо заранее для каждого наконечника/ссылки/задания/учебник/и т.д.

ответ

0

после того, что я изучаю ваш код ...Я, наконец, получил функциональный код ;-)

на первый ... Вот как выглядит приложение: enter image description here

и вот код:

---------- CalcController.h ----------- 
#import <Foundation/Foundation.h> 
#import <Cocoa/Cocoa.h> 

@interface CalcController : NSObject { 
    IBOutlet NSTextField *textField; 
} 

@property (weak) IBOutlet NSTextField *operandTextField; 
@property (weak) IBOutlet NSTextField *resultTextField; 

@property (nonatomic) double value1; 
@property (nonatomic) double value2; 
@property (nonatomic) double result; 
@property (nonatomic) NSString *operator; 

- (IBAction)plus:(id)sender; 
- (IBAction)result:(id)sender; 

@end 


---------- CalcController.m ----------- 
#import "CalcController.h" 

@implementation CalcController 

@synthesize operandTextField; 
@synthesize resultTextField; 

@synthesize value1; 
@synthesize value2; 
@synthesize result; 
@synthesize operator; 

- (IBAction)plus:(id)sender { 
    value1 = [textField doubleValue]; 
    NSLog(@"operand1 = %lf", value1); // for test and see value in console 
    [textField setStringValue:@""];  // for clear text after 1st input done 
    operator = @"+"; 
} 

- (IBAction)result:(id)sender { 

    value2 = [textField doubleValue]; 
    NSLog(@"operand2 = %lf", value2); // for test and see value in console 

    if ([operator isEqualToString:@"+"]) { 
     result = value1 + value2; 
     NSLog(@"value1: %lf + value2: %lf = result: %lf", value1, value2, result); // for tests and see values in console 
    } 

    [resultTextField setDoubleValue:result]; 
    operator = @""; 
} 

@end 

Думаю, что хорошо работает. ... теперь пришло время добавить следующие функции, кнопки с номерами и т. д.

Спасибо за то, что вы указали правильный путь!

+0

Это свойство '@property (слабый) IBOutlet NSTextField * operandTextField;' и этот синтезированный '@synthesize operandTextField;' не имеют отношения к делу и могут быть удалены .... правильно? Или мне это нужно? – Hancz

1

Пока у вас есть только один цикл, это довольно легко. (BTW:. Синтаксис математика человек (инфикс обозначение) немного странно для компьютерного программирования, правила приоритета и скобки необходимы, поэтому некоторые изобретен другой алгебраический синтаксис, в PN или reverse PN)

При нажатии оператором, вы храните оператор и первый операнд в ivar. Это состояние, которое вы вводите, и обычно в программировании графического интерфейса вы пытаетесь предотвратить состояния. Однако это то, что пользователи ожидают от калькулятора.

Сначала давайте украсим ваш код свойствами и сгенерированными иварами.

@interface AppController : NSObject 
@property (weak, nonatomic) IBOutlet NSTextField *operandTextField; 
@property (weak, nonatomic) IBOutlet NSTextField *resultTextField; 
@end 

Объявлять для первого значения и операции:

@interface AppController : NSObject 
@property (weak, nonatomic) IBOutlet NSTextField *operandTextField; 
@property (weak, nonatomic) IBOutlet NSTextField *resultTextField; 

@property (nonatomic) double operand; 
@property (nonatomic) NSString *operator; 
@end 

Тогда вам нужны действия для операций. Вот пример для одного:

@interface AppController : NSObject 
@property (weak, nonatomic) IBOutlet NSTextField *operandTextField; 
@property (weak, nonatomic) IBOutlet NSTextField *resultTextField; 

@property (nonatomic) double operand; 
@property (nonatomic) NSString *operator; 

- (IBAction)plus:(id)sender; 
@end 

Следующее, что вам нужно, это добавить действие для «начала операции». Вы можете подключить его к текстовому полю и сделать его «ввод».

@interface AppController : NSObject 
@property (weak, nonatomic) IBOutlet NSTextField *operandTextField; 
@property (weak, nonatomic) IBOutlet NSTextField *resultTextField; 

@property (nonatomic) double operand; 
@property (nonatomic) NSString *operator; 

- (IBAction)plus:(id)sender; 
- (IBAction)operate:(id)sender; 
@end 

ОК, сделано с интерфейсом. Перейдем к реализации:

@implementation AppController 
- (IBAction)plus:(id)sender 
{ 
    // Store operator 
    self.operator = [valueTextField doubleValue]; // Some checking? 

    // Store operation 
    self.operation = @"+"; // You can use int constant for that, but this is the easy way 
} 

- (IBAction)operate:(id)sender 
{ 
    // Check, whether a operation is already selected 
    if ([self.operation length]==0) 
    { 
    // No: Do nothing 
    return; 
    }  

    // Get the second operand 
    double operand = [valueTextField doubleValue]; 

    // Do the calculation 
    double result; 
    if ([self.operation isEqualToString:@"+"]) 
    { 
    result = self.operand + operand; 
    } 
    else if ([self.operation isEqualToString:@"-"]) 
    { 
    result = self.operand - operand; 
    } 
    … 

    [self.resultTextField setDoubleValue:result]; 
    self.operation = @""; 
    // If you do not set this, the next operand will start a new calculation with the first 
    // operand. Another feature would be to store the result we got and repeatedly perform 
    // the operation on the last result. But I would change the UI in that case. 
} 
@end 

Набирается в Safari.

+0

Спасибо вам большое за решение моего вопроса ... ваш ответ выглядит очень хорошо ;-) – Hancz

+0

Добро пожаловать. Как уже упоминалось, я набрал его в Safari. Если у вас есть вопрос или проблема, не стесняйтесь спрашивать меня в комментарии к ответу. –

+0

Большое спасибо за ваш дружеский подход ;-) – Hancz