Cocoa 如何覆盖方法的一小部分?
目前我在课堂上使用了这些方法,似乎效果不错。我想创建一个继承这些方法的子类。我的问题是,在第三种方法(shiftviewupworkeyboard)中,我希望if语句是不同的UITextField(镜像是当前的示例)。 我已经读过,要覆盖子类中的方法,基本上必须使用新的编码完全复制它,但是如果我只想更改那一小部分,那么最好的方法是什么? 先谢谢你Cocoa 如何覆盖方法的一小部分?,cocoa,Cocoa,目前我在课堂上使用了这些方法,似乎效果不错。我想创建一个继承这些方法的子类。我的问题是,在第三种方法(shiftviewupworkeyboard)中,我希望if语句是不同的UITextField(镜像是当前的示例)。 我已经读过,要覆盖子类中的方法,基本上必须使用新的编码完全复制它,但是如果我只想更改那一小部分,那么最好的方法是什么? 先谢谢你 - (void) viewWillAppear:(BOOL)animated { [[NSNotificationCenter defaultCen
- (void) viewWillAppear:(BOOL)animated {
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector(shiftViewUpForKeyboard:)
name: UIKeyboardWillShowNotification
object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector(shiftViewDownAfterKeyboard)
name: UIKeyboardWillHideNotification
object: nil];
}
- (void) viewDidDisappear:(BOOL)animated {
[[NSNotificationCenter defaultCenter] removeObserver: self
name: UIKeyboardWillShowNotification
object: nil];
[[NSNotificationCenter defaultCenter] removeObserver: self
name: UIKeyboardWillHideNotification
object: nil];
}
- (void) shiftViewUpForKeyboard: (NSNotification*) theNotification;
{
if(mirror.isEditing == YES)
{
CGRect keyboardFrame;
NSDictionary* userInfo = theNotification.userInfo;
keyboardSlideDuration = [[userInfo objectForKey: UIKeyboardAnimationDurationUserInfoKey] floatValue];
keyboardFrame = [[userInfo objectForKey: UIKeyboardFrameBeginUserInfoKey] CGRectValue];
UIInterfaceOrientation theStatusBarOrientation = [[UIApplication sharedApplication] statusBarOrientation];
if UIInterfaceOrientationIsLandscape(theStatusBarOrientation)
keyboardShiftAmount = keyboardFrame.size.width;
else
keyboardShiftAmount = keyboardFrame.size.height;
[UIView beginAnimations: @"ShiftUp" context: nil];
[UIView setAnimationDuration: keyboardSlideDuration];
self.view.center = CGPointMake( self.view.center.x, self.view.center.y - keyboardShiftAmount);
[UIView commitAnimations];
viewShiftedForKeyboard = TRUE;
}
}
通常的方法是:只提取类之间不同的方法的一部分,将其作为一个单独的方法,并在子类中重写它
[编辑以添加…]另一种方法——如果不看更多的代码,我无法判断它在这里是否能正常工作——是使传递到方法中的参数发生变化(或者根据传递到方法中的参数或其他类似的内容来选择它)。(你通常会使用其他机制,而不是继承+多态来获得你想要的效果,多个行为相似的东西:它们是同一个类的实例,但提供不同的数据。)通常的方法是:只提取不同类之间的方法的一部分,将其作为单独的方法,并在子类中重写
[编辑以添加…]另一种方法——如果不看更多的代码,我无法判断它在这里是否能正常工作——是使传递到方法中的参数发生变化(或者根据传递到方法中的参数或其他类似的内容来选择它)。(然后通常使用其他机制,而不是继承+多态性,以获得多个具有类似行为的对象的效果:它们是同一类的实例,但提供不同的数据。)在任何情况下,如果您不想复制子类中的完整方法,并添加少量自定义,我看到的唯一其他可能的方法是更改原始类。为此,我可以提出两种可能性: (一) 您可以在原始类中创建一个名为:
-(UITextField *)keyboardShiftTextField
代码为:
[[self keyboardShiftTextField] isEditing]
在这种情况下,两个类之间的唯一区别在于新方法的实现,原始类的区别在于:
-(UITextField *)keyboardShiftTextField {
return mirror;
}
在子类中,返回正确的文本字段
(二)
第二种方法更加优雅,因为它需要委托模式的定义。这需要一些代码开销,但我们将为您提供更大的灵活性。此外,如果创建子类的唯一原因只是重写第三个方法,那么使用委托模式可以完全避免创建子类,因为“自定义”工作将由委托完成。如果要重写的方法的数量不止一个,您仍然可以通过将所有需要自定义的部分移到“协议”部分来使用此机制。这是Obj-C和Cocoa非常常见的技术,在许多情况下限制了对某些类的需要。通常,当您想要提供不同的功能时,您会使用子类,但在您的情况下,您并没有提供不同的功能,只是为相同的功能进行了自定义(视图上移)。在任何情况下,如果您不想复制子类中的完整方法,并添加您的小自定义,我看到的唯一其他可能的方法是更改原始类。为此,我可以提出两种可能性:
(一)
您可以在原始类中创建一个名为:
-(UITextField *)keyboardShiftTextField
代码为:
[[self keyboardShiftTextField] isEditing]
在这种情况下,两个类之间的唯一区别在于新方法的实现,原始类的区别在于:
-(UITextField *)keyboardShiftTextField {
return mirror;
}
在子类中,返回正确的文本字段
(二)
第二种方法更加优雅,因为它需要委托模式的定义。这需要一些代码开销,但我们将为您提供更大的灵活性。此外,如果创建子类的唯一原因只是重写第三个方法,那么使用委托模式可以完全避免创建子类,因为“自定义”工作将由委托完成。如果要重写的方法的数量不止一个,您仍然可以通过将所有需要自定义的部分移到“协议”部分来使用此机制。这是Obj-C和Cocoa非常常见的技术,在许多情况下限制了对某些类的需要。通常,当您想要提供不同的功能时,您会使用子类,但在您的情况下,您并没有提供不同的功能,只是为相同的功能提供了一个自定义(视图向上移动)。感谢您的快速回复:所以可能类似于-(void)shiftviewupworkeyboard:(NSNotification*)通知:(UITextField*)theTextField{if(theTextField.isEditing==YES)诸如此类,诸如此类感谢您提供的有趣链接是的,您所描述的是我提到的“替代方法”。有关我描述的应用于您的代码的第一种方法的更多详细信息,请参阅viggio24的答案。感谢您的快速回复:所以可能类似于-(void)shiftviewupworkyboard:(NSNotification*)notification:(UITextField*)theTextField{if(theTextField.isEditing==YES)blah,blah}??谢谢你的有趣链接是的,你描述的是“替代方法”我提到过。有关我描述的应用于您的代码的第一种方法的更多详细信息,请参阅viggio24的答案。谢谢@viggio24。我喜欢代表的想法,因为这只是我想要调整的代码的一小部分,所以这个过程可能对我非常有帮助。我想我应该研究Apple文档,除非您有一些We’还行吗?我没有具体的教程。但是你会在这里找到一个来自苹果的很棒的文档:谢谢@viggio24。我喜欢代理的想法,因为这只是我想要的代码的一小部分