ios - UIViewController子类调用方法

标签 ios objective-c cocoa-touch uiviewcontroller delegates

我构建了一个实现各种 UI 功能的 UIViewController。它旨在供用户子类化,以便他们可以使用一些方法更新它,例如 setContents:getContents

在我的 UIViewController 中,当他们点击我希望用户在其子类 showPicker 中实现的按钮时,我将调用一个方法。

我希望用户能够控制他们在这个方法中所做的事情,所以我认为他们应该只在他们的子类中实现它:

- (void)showPicker {
    // Do what you want
}

为了做到这一点,我不得不在我原来的 UIViewController 中添加一个同名的空白方法,然后将它也添加到头文件中。

我想做的与您如何子类化 UIViewController 然后实现 viewWillAppear: 并在该方法中做您想做的完全一样。

如果我想让用户控制点击我的类中的按钮时发生的情况,这是应该遵循的正确模式吗?我做错了吗?我应该使用委托(delegate)吗?

最佳答案

如果你想模拟 UIViewControllerviewWillAppear: 的作用,你需要在你的基类。 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/

相关文章:

iphone - Objective-C : How do I draw lines with alpha in quad curve

ios - 当 App 从后台收到推送通知或在 iOS 中终止时,无法收听来自 NSNotificationCenter 的通知

iphone - 带有自定义控件的 MPMoviePlayerController

ios - 导航栏重叠状态栏

ios - 用 Swift 编写的类不能是 Nib 所有者(崩溃)

iphone - CGContextDrawImage 崩溃

iphone - MediaPlayer 或 AVFoundation 最终停止工作

objective-c - 如何将 NSString 方程解析成树? Objective-C

ios - UINavigationBar 的样式在 UIViewController 中不起作用

objective-c - touchesBegin & touchesMove Xcode Obj C 问题