gpt4 book ai didi

ios - UIViewController子类调用方法

转载 作者:行者123 更新时间:2023-11-28 22:16:43 25 4
gpt4 key购买 nike

我构建了一个实现各种 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com