变量无法从函数objective-c中访问

时间:2012-09-16 19:03:22

标签: objective-c xcode cocoa-touch

我已经为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";
}

3 个答案:

答案 0 :(得分:0)

函数不是类的一部分,它们无权访问实例变量。为什么不将此函数设为实例方法?

答案 1 :(得分:0)

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

在您的实施中声明它不会改变它。

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

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

答案 2 :(得分:0)

听起来你需要使用方法而不是函数来处理你的情况。

方法实际上是一种函数,它以静默方式将引用传递给自身的实例,其名称为{ {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); 来自的地方。

函数根本不会以这种方式处理,没有传递隐藏的参数,并且缺乏以静默方式访问实例变量,属性和方法。

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

HTH。