【问题标题】:Subclassing UIView and adding a property子类化 UIView 并添加属性
【发布时间】:2014-07-27 11:58:48
【问题描述】:

我已经尝试子类化 UIView。因为我想在我的 UIView 中有一个枚举,所以我可以检查 UIView 是否需要在我的游戏中被点击两次。但是我对子类化没有太多经验。它不工作。还是我需要创建一个类别?

我做过的事情:

  • 创建子类 UIView
  • 在自定义子类中创建属性
  • 将类从 UIView 更改为情节提要中的子类
  • 将所有 UIView 声明从我的游戏类更改为子类声明

代码:

#import <UIKit/UIKit.h>

typedef NS_ENUM(NSInteger, viewStaat) {
    ENUMEnkelTap,
    ENUMDubbelTap
};

@interface BannerView : UIView

@property (nonatomic, assign) viewStaat staatVanDeView;

@end

并在 UIView 的 init 中声明该属性。

@synthesize staatVanDeView;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        staatVanDeView = ENUMDubbelTap;
        NSLog(@"Set");
    }
    return self;
}

日志没有被调用,所以我不知道出了什么问题。 staatVanDeView 中的整数始终保持为 0。

【问题讨论】:

  • 非原子的就好了,因为整数是原始类型;你不需要分配。如果您在方法文件中合成属性,那么您可以在任何您喜欢的地方获取/设置属性。
  • 我已经编辑过了。我显然无法设置属性,并且没有调用日志。
  • 您是从 nib 上传您的视图还是在代码中创建它?
  • 由于是人工合成的属性,需要拨打self.staatVanDeView = ENUMDubbelTap
  • @VladislavKovalyov 我的视图设置在 Storyboard 中,并且我已将 UIViews 类更改为 UIView 的子类。

标签: ios objective-c uiview subclass objective-c-category


【解决方案1】:

从情节提要实例化视图时不会调用方法-initWithFrame:。请改用-initWithCoder:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
         staatVanDeView = ENUMDubbelTap;
    }
    return self;
} 

而且你不需要这条线

@synthesize staatVanDeView;

因为在最近的 iOS 版本中,属性的 getter 和 setter 是自动创建的。

【讨论】:

  • 谢谢伙计,这行得通!我可以从我的子类中删除initWithFrame吗?
  • 是的。当您总是从情节提要中实例化您的视图时,您可以删除 -initWithFrame 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 2023-04-06
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多