我有一个Objective-C UIView
类:
ChoosePersonView.h
@class Person;
@interface ChoosePersonView : MDCSwipeToChooseView
@property (nonatomic, strong, readonly) Person *person;
- (instancetype)initWithFrame:(CGRect)frame
person:(Person *)person
options:(MDCSwipeToChooseViewOptions *)options;
@end
MDCSwipeToChooseView.m
@class MDCSwipeToChooseViewOptions;
@interface MDCSwipeToChooseView : UIView
@property (nonatomic, strong) UIImageView *imageView;
@property (nonatomic, strong) UIView *likedView;
@property (nonatomic, strong) UIView *nopeView;
- (instancetype)initWithFrame:(CGRect)frame
options:(MDCSwipeToChooseViewOptions *)options;
@end
通常我会将其子类化并使用如下:
ChoosePersonView.m
@implementation ChoosePersonView
#pragma mark - Object Lifecycle
- (instancetype)initWithFrame:(CGRect)frame
person:(Person *)person
options:(MDCSwipeToChooseViewOptions *)options {
self = [super initWithFrame:frame options:options];
if (self) {
_person = person;
self.imageView.image = _person.image;
self.autoresizingMask = UIViewAutoresizingFlexibleHeight |
UIViewAutoresizingFlexibleWidth |
UIViewAutoresizingFlexibleBottomMargin;
self.imageView.autoresizingMask = self.autoresizingMask;
[self constructInformationView];
}
return self;
}
...
@end
我遇到的问题是当我尝试在Swift中执行此操作时,属性self.imageView
始终为nil
。
我不确定如何重新实施initWithFrame
,因为它在Swift中的Objective-C中实现。我认为使用init(frame: CGRect, person: Person, options: MDCSwipeToChooseViewOptions)
是正确的方法但我认为我可能是错的。
ChoosePersonView.swift
class ChoosePersonView: MDCSwipeToChooseView {
var informationView: UIView!
var nameLabel: UILabel!
var cameraImageLabelView: ImageLabelView!
var interestsImageLabelView: ImageLabelView!
var friendsImageLabelView: ImageLabelView!
var person: Person!
let ChoosePersonViewImageLabelWidth = CGFloat(42.0)
// #pragma mark - Object Lifecycle
init(frame: CGRect, person: Person, options: MDCSwipeToChooseViewOptions) {
super.init(frame: frame)
self.person = person
self.imageView.image = self.person.image // self.imageView is nil.
self.autoresizingMask = .FlexibleHeight | .FlexibleWidth | .FlexibleBottomMargin
self.imageView.autoresizingMask = self.autoresizingMask
self.constructInformationView()
}
....
}
答案 0 :(得分:1)
self.imageView
是零,因为你没有做任何让它不是零的事情。你没有显示任何会使它不是零的代码,所以你很难想象你应该如何发生这种情况。
我的猜测是MDCSwipeToChooseView
的初始值设定项的工作,您可以将其称为super.init(frame:options:)
来创建imageView
。很难说,因为你没有显示代码。当然,这是当您在Objective-C中编写ChoosePersonView时, 调用的初始化程序。那么为什么你现在也没有调用它,现在它是用Swift编写的?出于某种原因,您已选择不调用该初始化程序 - 您正在调用super.init(frame:)
。这似乎是一件非常奇怪的事情。也许这就是你出错的地方。
但无论如何我可以向你保证,如果你没有调用某些导致imageView
不是nil的代码,那么它将是nil,因为这是默认值对于Objective-C中的所有对象属性。