Objective C - 声明一个使用对象出口的函数

时间:2011-06-29 06:11:05

标签: objective-c

为了学习如何在Objective C中编程,我决定制作一个计算器应用程序(0-9,+, - 按钮等)。在我编程时,我注意到我的应用程序上的0-9按钮基本上都做了同样的事情(即:告诉唯一的TextBox显示被按下的数字)所以为什么不节省时间并制作一个能够做到这一点的功能。 / p>

问题是我不知道在哪里/如何声明这个函数,所以它可以向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 个答案:

答案 0 :(得分:1)

通过创建单个函数来减少重复的想法非常好(这被称为"Don't Repeat Yourself"原则)。但是,在这种情况下,最好的方法是创建一个方法,而不是一个函数。

一个IBAction方法可以连接任意数量的按钮。按钮可以通过tag区分,您可以在Interface Builder的检查器中轻松设置。为每个数字按钮添加一个独特的标签;在这种情况下,最好将每个标记设置为按钮所代表的数字。

然后为所有数字按钮创建一个IBAction

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

请注意,我已将方法和实例变量名称更改为以小写字母开头;这在ObjC代码中是常规的。明确键入IBOutletNSTextField而不是通用id)也很不错;这样可以防止您错误地将它连接到错误的对象,以及其他错误。

在Interface Builder中将所有数字按钮连接到此一个操作。调用该方法后,只需访问按钮的标签即可设置文本字段:

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

至于你明确的问题 - 应该声明函数的位置 - 你通常会将它放在@implementation之上的.m文件中。*你得到的错误是由于你试图在任何对象的方法之外访问属于对象的实例变量Text。只有方法内的代码才能以这种方式访问​​对象的ivars。


*虽然它除了@interface块内外几乎可以去任何地方。

答案 1 :(得分:0)

首先想到你需要了解每个UIObject都有标签值。例如,如果声明按钮意味着默认情况下它具有名为tag value的属性。对于数字1,您设置1意味着使用此标记您可以访问该值。

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

答案 2 :(得分:0)

根据Josh Caswell的建议,您可以通过在主视图或任何视图上放置所需数量的按钮来实现,只需在IBOutlet中指定标签值,标签值就可以区分您的情况下的按钮。在你的情况下,我猜你需要几乎15-18个按钮。使用IB会减少你的工作

TNQ