我想这是基本的,但我无法理解这一点。
我曾经只有一个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,或者弹出的附件等等)。
非常欢迎任何建议。
答案 0 :(得分:1)
示例:
A类包含一个ivar UITextField textField
B类是A类的子类,因此它已经包含了ivar textField
注意:这不是相反的方式。 A类没有“看到”B类中创造的东西。
当你为一个类创建子类时,你给新类提供了与该子类相同的ivars end方法。
我希望这就是你所要求的。
修改强>
所以对于你的例子,我会做以下几点:
- (BOOL)textFieldShouldReturn:(UITextField *)textField
注意方法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];
现在只需实现委托方法并执行任何必要的操作。