我构建了一个实现各种 UI 功能的 UIViewController
。它旨在供用户子类化,以便他们可以使用一些方法更新它,例如 setContents:
和 getContents
。
在我的 UIViewController
中,当他们点击我希望用户在其子类 showPicker
中实现的按钮时,我将调用一个方法。
我希望用户能够控制他们在这个方法中所做的事情,所以我认为他们应该只在他们的子类中实现它:
- (void)showPicker {
// Do what you want
}
为了做到这一点,我不得不在我原来的 UIViewController
中添加一个同名的空白方法,然后将它也添加到头文件中。
我想做的与您如何子类化 UIViewController
然后实现 viewWillAppear:
并在该方法中做您想做的完全一样。
如果我想让用户控制点击我的类中的按钮时发生的情况,这是应该遵循的正确模式吗?我做错了吗?我应该使用委托(delegate)吗?
最佳答案
如果你想模拟 UIViewController
对 viewWillAppear:
的作用,你需要在你的基类。 UIViewController.h
表示 viewWillAppear:
具有不执行任何操作的默认实现。
委托(delegate)会使您的基类和子类都复杂化,而没有真正简化多少返回。与抽象方法相比,它们更接近于通知。
这里的其他选项是按照以下方式做一些事情:
if ([self canPerformSelector:@selector(showPicker)]) {
...
}
它并没有像我喜欢的那样提供尽可能多的编译时安全性,但它是一个替代方案,并将大部分责任保留在基类中。但我发现它不像基类中的空方法实现那样容易发现。
如果您不希望基类中抽象方法的空实现,协议(protocol)可能更合适,它可以平衡可发现性和编译时安全性。
@protocol PickerProtocol <NSObject>
- (void)showPicker;
@end
@interface SomeBaseClass : UIViewController
...
@end
@implementation SomeBaseClass
- (void)someBaseClassMethod {
if ([self conformsToProtocol:@protocol(Picker)]) {
[(id<PickerProtocol>)self showPicker];
}
}
@end
你的子类通过声明它们已经实现了协议(protocol)来选择加入,允许编译器在你没有实现所有 @required
方法时发出警告。
@interface MySubClass <PickerProtocol>
...
@end
@implementation MySubClass
- (void)showPicker {
...
}
@end
这允许编译器显示警告和代码完成。虽然它不像空基类方法那么简单,但它确实允许子类显式声明它们提供某些行为。
如果这里或那里只是一个方法,我会使用空方法方法。如果您有应该一起实现的方法组,我会使用协议(protocol)。
关于ios - UIViewController子类调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21470818/