如何在子类中访问ViewController的变量?

时间:2011-05-03 16:40:09

标签: iphone objective-c cocoa-touch subclassing

我想这是基本的,但我无法理解这一点。

我曾经只有一个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,或者弹出的附件等等)。

非常欢迎任何建议。

2 个答案:

答案 0 :(得分:1)

示例:

A类包含一个ivar UITextField textField

B类是A类的子类,因此它已经包含了ivar textField

注意:这不是相反的方式。 A类没有“看到”B类中创造的东西。

当你为一个类创建子类时,你给新类提供了与该子类相同的ivars end方法。

我希望这就是你所要求的。

修改

所以对于你的例子,我会做以下几点:

  • 创建一个类“MyUIKeybordEventResponder”
  • 实施所有响应方法,例如- (BOOL)textFieldShouldReturn:(UITextField *)textField
  • 从“MyUIKeybordEventResponder”
  • 对您的ViewController进行子类化

注意方法textFieldSHouldReturn有一个参数UITextField,因此它知道按下了哪个文本字段。所以在某种程度上它从子类接收你的textField。

答案 1 :(得分:1)

如果我正确理解了这一点,你有一个带有MyKeyboardEventsViewController的UIViewController作为实例变量,你想要在两者之间进行通信吗?如果是这种情况,一种选择是创建协议。

@protocol MyKeyboardDelegate 

- (void)closeAccessoryView;

@end

(注意 - 在你需要的协议中制作任何方法,这只是一个例子)

在MyKeyboardEventsViewController中,然后包含协议文件,并创建一个ivar

id <MyKeyboardDelegate> delegate;

也使它成为一个属性并合成它。

无论创建keyboardviewcontroller的类是什么,都应该将自己视为符合协议。

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

创建MyKeyboardEventsViewController时,请设置委托。

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

[eventsVC setDelegate:self];

现在只需实现委托方法并执行任何必要的操作。