没有在 UIView 中调用自定义设置器

Posted

技术标签:

【中文标题】没有在 UIView 中调用自定义设置器【英文标题】:Custom setter not getting called in UIView 【发布时间】:2014-01-24 06:54:36 【问题描述】:

我正在为 bool 属性使用自定义设置器,因为当这个值发生变化时我需要做一些额外的工作。这是我的实现:

MyView.h

@interface MyView : UIView 

@property (nonatomic) BOOL isSelected;

@end

MyView.m

@implementation MyView

@synthesize isSelected;

-(void)setIsSelected:(BOOL)_isSelected

    self.isSelected = _isSelected;

    //Custom code that changes UI based on bool state  




@end

但是 setter 没有被调用!谁能告诉我为什么?

【问题讨论】:

当你期望你的setter方法被调用时,你如何设置属性?更多......您不能在 setter 方法中使用点表示法设置属性。 同班,我去... isSelected = YES; 你应该这样做self.isSelected = YES ; 【参考方案1】:

有两种方法来设置你的属性和你的 setter 方法被调用。

1、点语法:self.isSelected = YES ; 2、直接调用。 [设置 setIsSelected:YES] ;

@interface MyView : UIView 
@property (nonatomic) BOOL isSelected;
@end

@implementation MyView
@synthesize isSelected;
-(void)setIsSelected:(BOOL)_isSelected

    isSelected = _isSelected;
    //Custom code that changes UI based on bool state  

@end

您的应用程序崩溃,因为您在 setter 方法中调用 self.isSelected = _isSelected,它会递归且无休止地调用您的 setter 方法,直到堆栈溢出!

【讨论】:

谢谢,这解决了!我想我可以在下一次 ios 面试中问这个问题! :-)【参考方案2】:

例如在 viewDidLoad 设置值self.isSelected=YES;,或者你想设置这个值的地方。

您的 setter 方法应如下所示:

-(void)setIsSelected:(BOOL)seleted

    _isSelected = seleted;

    //Custom code that changes UI based on bool state



如果您在 setter 中使用该代码,这就是“setter 循环”:self.isSelected = _isSelected;

【讨论】:

谢谢,这解决了!我想我可以在下一次 iOS 面试中问这个问题! :-)【参考方案3】:

试试这个,

   //in myView.h
   @interface customView : UIView
  

  
  @property(nonatomic)BOOL *isSelected;
  @end

在 myView.m 文件中

    @implementation customView
    @synthesize isSelected = _isSelected;


    - (void)setIsSelected:(BOOL *)inSelected //inSelected is the in coming value for bool
    
       _isSelected = inSelected;
       NSLog(@"setter is called");
    

【讨论】:

【参考方案4】:

尝试将-(void)setIsSelected: 方法的参数_isSelected 更改为其他变量,例如selected,并使用它在方法中将属性分配为_isSelected = selected;

【讨论】:

我这样做了。它会导致应用程序在设置器中使用 EXC_BAD_ACCESS 崩溃【参考方案5】:

在某些情况下,当你的对象为 nil 时,它会给你一种 setter 和 getter 没有被调用的感觉。希望您能解决问题。

【讨论】:

亚伦最好把你的答案。作为对用户问题的评论。

以上是关于没有在 UIView 中调用自定义设置器的主要内容,如果未能解决你的问题,请参考以下文章

为啥在我的自定义 UIView 类中没有调用 init(frame: CGRect)?

在自定义 UIView 上为 UIButton 设置动画

我的自定义 UIView 没有显示在屏幕上

如何让 qt 设计器自定义 QOpenGLWidget 小部件背景透明?

Xamarin Forms Shell 如何使用自定义渲染器自定义选项卡

UITapGestureRecognizer 在自定义 UIView 中不起作用