Цель C - Объявление функции, которая использует выход объекта - PullRequest
0 голосов
/ 29 июня 2011

в интересах изучения программирования в Objective CI решили создать приложение калькулятора (с кнопками 0-9, +, - и т. Д.).Когда я программировал, я заметил, что кнопки 0-9 в моем приложении в основном делали одно и то же (то есть: сообщали единственному TextBox, чтобы отображалось любое нажатое число), так почему бы не сэкономить время и создать функцию, которая делает именно это.

Проблема в том, что я не знаю, где / как объявить эту функцию, чтобы она могла отправить сообщение в TextBox.Я попытался поместить это множество мест, и я получаю множество ошибок:

MyCustomObject.h

   //imports and declaring variables

   @interface MyCustomObject: NSObject{
       IBOutlet id Text;

   /* 1. declaring function here gives the error: expected ':', ',', ';', '}' or 
   '__attribute__' before '{' token. It has the "{" line highlighted */
   }

   - (IBAction)ButtonOne:(id)sender;
   //A lot of (IBAction) lines like the one above

   /* 2. Declaring here gives the same error as the 1., highlighting the same line*/
   @end

   /* 3. Declaring here gives the error:"Text" undeclared highlighting the [text]line*/

MyCustomObject.m

   //imports 

   /* 4. Declaring here gives the same error as 3. highlighting the same line*/

   @implementation Solver

   /* 5. Declaring here gives the same error as 3. highlighting the same line*/

   - (IBAction)ButtonOne:(id)sender {
        TheFunctionIWantToDeclare(@"1");
   }
   //Some more -(IBAction)'s with code
   @end

Кодфункция, которую я хочу объявить

   void TheFunctionIWantToDeclare (NSString*x)
   {
    [Text setStringValue:x];
    //more code here but the only part thats giving me grief is the above line
   }

Ответы [ 3 ]

1 голос
/ 29 июня 2011

Ваша идея уменьшить количество повторений с помощью создания одной функции превосходна (это известно как принцип «Не повторяй себя» ). В этом случае, однако, лучший способ сделать это - создать отдельный метод , а не функцию.

Один метод IBAction может иметь любое количество кнопок, подключенных к нему. Кнопки можно различить по их tag, которые вы можете легко установить в инспекторе Интерфейсного Разработчика. Дайте каждой из ваших цифровых кнопок отдельный тег; в этом случае лучше установить для каждого тега число, которое представляет кнопка.

Затем вы создаете одну единственную IBAction для всех ваших цифровых кнопок:

@interface MyCustomObject: NSObject{
   IBOutlet NSTextField * myTextField;
}
- (IBAction) numberButtonPressed: (id)sender;
// Other methods...
@end

Обратите внимание, что я изменил имена переменных метода и экземпляра, чтобы они начинались со строчных букв; это обычное явление в коде ObjC. Также хорошо явно набрать ваш IBOutlet (NSTextField вместо общего id); это предотвратит ошибочное подключение его к неправильному объекту, среди прочих ошибок.

Подключите все цифровые кнопки к этому действию в Интерфейсном Разработчике. Когда метод вызывается, вы просто получаете доступ к тегу кнопки, чтобы установить текстовое поле:

- (IBAction) numberButtonPressed: (id)sender {
    [myTextField setIntegerValue:[sender tag]];
}

Что касается вашего явного вопроса - где должна быть объявлена ​​функция - вы обычно помещаете ее в файл .m, над @implementation. * Ошибка, которую вы получаете, связана с попыткой доступа к переменная экземпляра, Text, которая принадлежит объекту вне любого из методов объекта. Только код внутри метода может получить доступ к ивару объекта таким образом.


* Хотя он может идти куда угодно, кроме как внутри блока @interface.

0 голосов
/ 29 июня 2011

В соответствии с предложением Джоша Касвелла вы можете сделать это, поместив столько кнопок, сколько нужно на главном или любом виде, и просто назначить значения тегов в IBOutlet, а значение тега отличает кнопки в вашем случае.в вашем случае вам нужно почти 15-18 кнопок, я думаю. использование IB уменьшит вашу работу

TNQ

0 голосов
/ 29 июня 2011

сначала подумайте, что вам нужно понять, что каждый UIObject имеет значение тега. например, если вы объявляете кнопку, значит, по умолчанию она имеет свойство с именем tag value. для числа 1, установленного вами, 1 означает, что с помощью этого тега вы можете получить доступ к значению.

{ nslog(@"%d",sender.tag); TheFunctionIWantToDeclare(sender.tag); }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...