2012-09-16 22 views
0

我为textview创建了一个插口,我试图在其未声明的函数外部使用它。当我将它与像StartFunction(textBox)这样的函数一起传递时,它可以正常工作,但此函数也必须与其他许多类似的东西一起工作,并且我不喜欢将所有内容都传递给该函数的想法。函数objective-c中无法访问的变量

什么是更好的选择?

// Header File 
- (IBAction)startButton_clicked:(id)sender; 
@property (strong, nonatomic) IBOutlet UITextView *textBox; 

// Main file 
- (IBAction)startButton_clicked:(id)sender { 
    if (currentlyOn == false) StartFunction(headLabel); 
     else textBox.text = @"Already Started"; // Works fine here 
      } 

void StartFunction(UILabel *_headLabel) 
{ 
    _headLabel.text = @"This works fine because it's passed with the function"; 
    textBox.text = @"textBox is undeclared here"; 
} 

回答

1

这听起来像你需要使用方法而不是函数为您的情况。

方法确实是一个类型功能被默默地通过的参考到自己的一个实例,这种被命名为self。使用该参考,该方法可以访问实例变量,方法属性self的使用也经常为你自动添加。

因此,假设你的代码是myClass你的方法的一部分startButton_clicked大约(我们掩饰一些细节)一样的功能:

IBAction startButton_clicked(myClass *self, id sender) 
{ 
    if (currentlyRecording == false) 
     StartRecordingAudio(headLabel); 
    else 
     self.textBox.text = @"Already Started"; // Works fine here 
} 

注意额外的参数和使用self在作业中。方法调用:

[someInstanceOfMyClass startButton_clicked:theSender]; 

大约等效于:

startButton_clicked(someInstanceOfMyClass, theSender); 

其是其中默默地传递self来自。

函数根本没有这种处理方式,没有隐藏的参数传递,并且没有那种沉默的方式来访问实例变量,属性和方法。

这两种方法和功能都有其用途,您可以根据需要进行选择。在你的情况下,你听起来像需要一种方法来访问一个实例。

HTH。

+0

这是相当'startButton_clicked(例如,@selector(buttonClicked),发送者);':) – 2012-09-16 19:30:04

+0

@ H2CO3 - 因此, **大约** - 包括基本的细节只是为了解释发生了什么。 – CRD

+0

是的,我注意到,只是为了清楚起见:) – 2012-09-16 21:11:46

0

函数不是类的一部分,它们不能访问实例变量。为什么不把这个函数变成实例方法呢?

0

纯C函数不能用作Objective-C类的成员。

在你的实现中声明它并不会改变它。

使用Objective-C方法,或将对象传递给C函数(如果它们具有公共iVars,通常是不好的设计,或者可以使用属性)。

第一个解决方案总是更好。如果您不希望方法的原型出现在公共头文件中,则可以使用类扩展。

+0

我们再见面...... – 2012-09-16 19:10:07

+0

:)看起来我们是在同一个主题... – Macmade