2012-09-16 55 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