0

テキストビューのアウトレットを作成しましたが、それを関数で使用しようとしています。関数の外では正常に動作し、宣言されていません。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 関数に渡します (通常は不適切な設計である public iVar がある場合、またはプロパティを使用できる場合)。

最初の解決策は常に優れています。メソッドのプロトタイプをパブリック ヘッダー ファイルに表示したくない場合は、クラス拡張を使用できます。

于 2012-09-16T19:09:39.967 に答える
0

あなたの状況では、関数ではなくメソッドを使用する必要があるようです。

メソッドは実際には、それ自体のインスタンスへの参照を黙って渡されるタイプの関数であり、これには という名前が付けられます。その参照を使用して、メソッドはインスタンス変数メソッド、およびプロパティにアクセスできます。の使用も、多くの場合、黙って追加されます。selfself

したがって、コードが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 に答える