0

我已经为 textview 创建了一个出口,我试图在一个函数中使用它,在它工作正常的函数之外,在它未声明的内部。当我将它与 StartFunction(textBox) 之类的函数一起传递时,它可以正常工作,但是该函数还必须与许多其他类似的东西一起使用,而且我不喜欢只使用函数传递所有内容的想法。

什么是更好的选择?

// 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";
}
4

3 回答 3

0

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

于 2012-09-16T19:09:24.720 回答
0

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

在您的实现中声明它不会改变这一点。

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

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

于 2012-09-16T19:09:39.967 回答
0

听起来您需要针对您的情况使用方法而不是函数

方法实际上是一种函数它默默地传递对自身实例的引用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。

于 2012-09-16T19:18:05.337 回答