2011-05-03 35 views
0

我想這是基本的,但我無法理解這一點。如何在子類中訪問ViewController的變量?

我以前只有一個ViewController,其中定義了所有的變量,例如,一個名爲myTextView的UITextView。我在這個ViewController中也有方法來處理與myTextView有關的事件,比如-()hideKeyboard { // do something with myTextView- (void)keyboardWillShow:(NSNotification *)notification { // do something with myTextView

隨着我的程序變得越來越大,我想到了使用子類,特別是其他視圖。所以我開始了一個子類,例如。 mySubClass.h和mySubClass.m,其中我有另一個UITextView(參數爲myOtherTextView)。爲了將mySubClass,我#imported它到我的ViewController並添加了一個@class mySubClass;,然後可以生成這個類的實例,以便在我的應用程序中使用它。

到目前爲止這麼好。正如你可以想象的那樣,我在ViewController中定義的所有好方法都會在編輯UITextView(如隱藏鍵盤等)時發生的情況不適用於mySubClass中的UITextView。

因此,有人建議,我認爲我應該讓另一個類中,我把所有的鍵盤事件和繼承我的ViewController和mySubView它:

@interface ViewController : MyKeyboardEventsViewController 

現在,我看到的問題是,我將無法訪問我在ViewController中創建的所有視圖,文本視圖,文本框等(例如前面提到的myTextView)。

我該如何實現在我的ViewController中定義的所有變量也可用於MyKeyboardEventsViewController?或者有另一種方法來處理這個問題?

基本上,我沒有得到MyKeyboardEventsViewController如何訪問我需要的ViewController中的變量(例如UITextView,或者會彈出的accessoryView等等)。

任何建議將非常受歡迎。

回答

1

實施例:

A類包含的ivar的UITextField的TextField

B類亞類A級,因此它已含有的ivar的TextField

注:它不是周圍的其他方法。 A類不會「看到」B類中創建了什麼。

當您爲子類創建子類時,將爲您的新類指定與該子類相同的ivars結束方法。

我希望這是你所要求的。

編輯

因此,對於你的例子,我會做follwing:

  • 創建一個類 「MyUIKeybordEventResponder」
  • 實現所有的應答方法,如- (BOOL)textFieldShouldReturn:(UITextField *)textField
  • 小類您的ViewController從「MyUIKeybordEventResponder」

注意方法textFieldSHouldReturn有一個參數UITextField,因此它知道哪個文本字段被按下。所以它以某種方式從子類中接收你的textField。

+0

所以在我的情況下,UITextField需要在MyKeyboardEventsViewController中定義。我的viewController然後是MyKeyboardEventsViewController的子類,因此可以訪問UITextField。在這種情況下,我不能簡單地將mySubClass分類到我的viewController?或者這是不好的編程習慣?據我現在瞭解,看來我的ViewController中不會留下太多代碼......是那個標準嗎?現在我在我的ViewController中幾乎都有一些東西......我想這不太好。 – 2011-05-03 16:56:16

+0

關於您的編輯:hideKeyboard知道哪些文本框/視圖已發送?例如' - (IBAction)hideKeyboard { \t \t textView.scrollEnabled = NO; \t [textView resignFirstResponder];' – 2011-05-03 17:00:19

+1

爲了您的情況,您應該在viewController中實現您的UITextField,然後在MyKeyboardEventsViewController中實現所有UITextFieldDelegate方法。使你的viewController成爲MyKeyboardEventsViewController的一個子類。 B/c MyKeyboardEventsViewController是UITextFieldDelegate的代理,當它需要響應時它會接收對象(UITextField),因此您不必擔心自己手動傳遞它。 – Cyprian 2011-05-03 17:01:16

1

如果我正確理解這個,你有一個UIViewController與MyKeyboardEventsViewController作爲一個實例變量,你想在兩者之間進行通信?如果是這樣的話,一種選擇是創建一個協議。

@protocol MyKeyboardDelegate 

- (void)closeAccessoryView; 

@end 

(注 - 使任何在您需要的協議方法,這是一個簡單的例子)

在你MyKeyboardEventsViewController你再包括協議文件,並創建一個伊娃

id <MyKeyboardDelegate> delegate; 

也使它成爲一個屬性並將其合成。

無論創建keyboardviewcontroller的任何類都應該遵守協議來保護自己。

@interface MyViewController : UIViewController <MyKeyboardDelegate> 
    ... 
@end 

當您創建MyKeyboardEventsViewController時,請設置委託。

MyKeyboardEventsViewController *eventsVC = [[MyKeyboardEventsViewController alloc] init]; 

[eventsVC setDelegate:self];

現在只實現委託方法和執行任何的行動,是必要的。