最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

[已解决]Swift代码出错:Method setViewControllers with Objective-C selector setViewControllers: conflicts with setter for viewControllers with the same Objective-C selector

Swift crifan 2990浏览 0评论
[背景]
swift代码:
func setViewControllers(newViewControllers:NSArray) {
出错:
Method ‘setViewControllers’ with Objective-C selector ‘setViewControllers:’ conflicts with setter for ‘viewControllers’ with the same Objective-C selector
如图:

Method setViewControllers with Objective-C selector setViewControllers- conflicts with setter for viewControllers with the same Objective-C selector

[解决过程]
1.后来点击右边的红色点,调转到上面的定义:
var viewControllers = [UIViewController]()

如图:

var viewControllers UIViewController
看起来很明显了:
此处由于有了变量(属性)的viewControllers定义
-》系统自动生成了其getter和setter
-》对应的setter就是:setViewControllers
-》而此处自己实现了
func setViewControllers(newViewControllers:NSArray) {
所以和系统内部生成的冲突了。
-》感觉是:要么自己把这个函数改名,要么去声明是override
-》直接前面加override就可以了?去试试
2.先去搜搜吧
swift Method setViewControllers with Objective-C selector setViewControllers: conflicts with setter for viewControllers with the same Objective-C selector
参考:
没有完全的看懂。
但是决定参考那个做法,去直接改名字算了。
3.但是觉得好像不对:
原先的OC的代码就是:
.h:
@property (nonatomic, copy) NSArray *viewControllers;

- (void)setSelectedViewController:(UIViewController *)viewController animated:(BOOL)animated;
.m
- (void)setViewControllers:(NSArray *)newViewControllers
{
}
然后对于:
setViewControllers
也没有其他地方调用:
not found more search result for setViewControllers
应该是:
其本意就是:
setViewControllers重写override这个viewControllers
(后来才看到demo中的调用:
NSArray *viewControllers = @[listViewController1, listViewController2, listViewController3];
MHTabBarController *tabBarController = [[MHTabBarController alloc] init];

tabBarController.delegate = self;
tabBarController.viewControllers = viewControllers;
证实了我的猜想)
所以,此处的Swift中也需要:
搞清楚,如何override这个viewControllers
4.搜:
swift how override setter
参考:
官网也没有给出setXXX的例子。。
自己去试试
5.突然看到,自己此处的代码是:
var viewControllers = [UIViewController]()

 func setViewControllers(newViewControllers:NSArray) {
应该是:
参数NSArray而不是UIViewController
改为UIViewController估计就可以了。
去试试。
func setViewControllers(newViewControllers:UIViewController) {
结果错误依旧。
6.再去加上override:
override func setViewControllers(newViewControllers:UIViewController) {
结果又:
Method does not override any method from its superclass
7.搜:
swift override  property setter
参考:
8.好像又搞错了:
var viewControllers = [UIViewController]()
参数应该是数组才对?
试试:
func setViewControllers(newViewControllers:[UIViewController]) {
错误依旧。
加了override:
override func setViewControllers(newViewControllers:[UIViewController]) {
又是:
Method does not override any method from its superclass
9.后来终于在官网中:
看到了,如何重写setter,其实就是:
Property Observers
然后是用Property Observers去管理属性的值:
每次属性的值变化了:被设置了一个新值,即是新值和旧值是一样的,也就被调用
会在新的值被存储之前被调用:willSet
在新的值被存储之后立刻调用:didSet
需要实现对应的,监视值的变化,重写值的setter,则可以去实现对应的wilSet和(,或)didSet
那此处,去折腾willSet和didSet
结果又出现错误:

[已解决]Swift代码出错:Cannot invoke initializer for type [UIViewController] with an argument list of type (() -> ())

转载请注明:在路上 » [已解决]Swift代码出错:Method setViewControllers with Objective-C selector setViewControllers: conflicts with setter for viewControllers with the same Objective-C selector

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
86 queries in 0.175 seconds, using 22.11MB memory