2012-02-22 3 views
0

Я только что начал класс Stanford iOS5 и завершил калькулятор RPN, но хочу, чтобы кнопка «Очистить» работала по-другому. Вот как у меня сейчас, без каких-либо изменений в CalculatorModel «мозг»:CS193P Назначение 1 Очистить

- (IBAction)clearPressed 
{ 
    self.display.text = @"";      // Clear the display 
    self.historyWindow.text = @"";     // Clear the history window 
    self.model = nil;        // Reset the stack 
    self.userIsInMiddleOfEnteringNumber = NO;  // Reset user typing boolean 
} 

Может быть, я ошибаюсь, но «self.model = ноль;» похоже, что он действительно не удаляет объекты из стека, это просто имитирует это. Поэтому я добавил функцию к CalculatorModel «мозга»:

-(void) clearOperandStack 
{ 
    [self.operandStack removeAllObjects]; 
} 

и хотите назвать его в моей функции «clearPressed» в CalculatorViewController, но у меня возникли проблемы, возможно, потому, что я не совсем понимаю, Objective C пока. Это то, что я думал, что должен был сделать, но, похоже, он не хочет работать.

- (IBAction)clearPressed 
{ 
    self.display.text = @"";      // Clear the display 
    self.historyWindow.text = @"";     // Clear the history window 
// self.model = nil;        // Reset the stack 
    [self.model clearOperandStack]; 
    self.userIsInMiddleOfEnteringNumber = NO;  // Reset user typing boolean 
} 

Может кто-нибудь, пожалуйста, объясните мне правильный способ назвать этот метод/то, что я делаю неправильно?

+0

Вы добавили объявление в файл .h? – rooftop

+0

Не похоже, что вы хотите работать_ - вы получаете ошибки компиляции? ошибки времени выполнения? Что оно делает? Что вы ожидали от этого? – sarnold

+0

На крыше, вы были правы. Я не добавил объявление в файле .h. Я предполагаю, что если вы добавите его в файл реализации, а не интерфейс, он считается частной функцией? Спасибо за помощь! – Joey

ответ

1

Вот ссылка на другой поток, который отвечает на вопрос.

CS193P - Adding cancel button to iOS calculator

Давайте посмотрим, если я могу объяснить, почему self.model = ноль;

Я собираюсь использовать аналогию с листом бумаги для вашей модели. На этой бумаге вы можете написать свой стек, а также любые дополнительные вещи, о которых может знать ваша модель.

Предполагая, что вы лениво инстанцировали ваш геттер для модели (как это сделал инструктор); Когда вы вызываете self.model, если у вас уже есть лист бумаги с вашей моделью, он даст вам то, что если у вас нет листа бумаги для вашей модели, он возьмет чистый лист бумаги и сделает это вашей модели.

Теперь, когда вы говорите self.model = nil; вы говорите, что выбрасываете лист своей модели. Это означает, что теперь у вас уже есть стек или какие-либо дополнительные вещи, которые есть в вашей модели.

Теперь, когда получатель лениво создается, когда вы попросите свою модель в следующий раз, у нее ее еще нет, так что она сделает для вас совершенно новую.

Так что, может быть, краткое резюме self.model = nil; не опустошает ваш стек, он полностью удаляет стек, у вас нет пустого стека, у вас нет стека.

Принимая во внимание, что ваш clearOperandsStack просто опустошает стек, чтобы у вас был пустой стек.

+0

Благодарим вас за четкое объяснение @Joe_Schmoe. Существует ли какая-либо конвенция, по которой лучше практиковать? Выбросить стек или просто очистить его? – Joey

Смежные вопросы