将 self.property 传递给函数
Pass self.property to the function
我在获取 属性 时遇到问题。当我将 _videoRect 传递给 drawArea 函数时,没有任何反应。但是,如果我改变 self.videoRect 那就完美了。
我的代码:
@property (nonatomic, assign) BOOL isRecording;
@property (nonatomic) NSValue* videoRect;
@implementation Interactor
@synthesize videoRect = _videoRect;
- (id)init {
_isRecording = NO;
[self createVideoObserver];
return self;
}
- (void)record {
_isRecording = !_isRecording;
if (!_isRecording) {
[self stop];
[_presenter animateRecordButton:_isRecording];
} else {
[self drawArea:&(_videoRect) completion:nil];
}
}
- (void)drawArea:(NSValue* __strong *)rect completion:(void (^ __nullable)(void))completion {
if (!_isFullScreen) {
*rect = [NSValue valueWithRect:[self fullScreenRect]];
} else {
[self drawScreenRect];
}
if (completion != NULL) {
completion();
}
}
Setter 和 getter:
- (void)setVideoRect:(NSValue*)videoRect {
_videoRect = videoRect;
}
- (NSValue*)videoRect {
return _videoRect;
}
创建视频观察者:
- (void)createVideoObserver {
[[RACObserve(self, videoRect) skip:1] subscribeNext:^(id _) {
[self start];
[_presenter animateRecordButton:_isRecording];
}];
}
我不明白为什么观察者不起作用。如何将 self.videoRect 传递给 drawArea 函数?
您的 -drawArea:completion:
方法采用指向 NSValue
的指针,而 self.videoRect
是指向 NSValue
的 属性。在Swift中,你可以像这样通过引用传递一个属性,但在Objective-C中,一个属性实际上只不过是几个方法,其中一个设置一个实例变量和一个 returns 它。因此,仅将 属性 传递到方法中是行不通的。您需要做的是读取 属性,传递指向结果值的指针,然后用新值修改 属性:
NSValue *videoRect = self.videoRect;
[self drawArea:&videoRect completion:^{
...
self.videoRect = videoRect;
}];
我在获取 属性 时遇到问题。当我将 _videoRect 传递给 drawArea 函数时,没有任何反应。但是,如果我改变 self.videoRect 那就完美了。
我的代码:
@property (nonatomic, assign) BOOL isRecording;
@property (nonatomic) NSValue* videoRect;
@implementation Interactor
@synthesize videoRect = _videoRect;
- (id)init {
_isRecording = NO;
[self createVideoObserver];
return self;
}
- (void)record {
_isRecording = !_isRecording;
if (!_isRecording) {
[self stop];
[_presenter animateRecordButton:_isRecording];
} else {
[self drawArea:&(_videoRect) completion:nil];
}
}
- (void)drawArea:(NSValue* __strong *)rect completion:(void (^ __nullable)(void))completion {
if (!_isFullScreen) {
*rect = [NSValue valueWithRect:[self fullScreenRect]];
} else {
[self drawScreenRect];
}
if (completion != NULL) {
completion();
}
}
Setter 和 getter:
- (void)setVideoRect:(NSValue*)videoRect {
_videoRect = videoRect;
}
- (NSValue*)videoRect {
return _videoRect;
}
创建视频观察者:
- (void)createVideoObserver {
[[RACObserve(self, videoRect) skip:1] subscribeNext:^(id _) {
[self start];
[_presenter animateRecordButton:_isRecording];
}];
}
我不明白为什么观察者不起作用。如何将 self.videoRect 传递给 drawArea 函数?
您的 -drawArea:completion:
方法采用指向 NSValue
的指针,而 self.videoRect
是指向 NSValue
的 属性。在Swift中,你可以像这样通过引用传递一个属性,但在Objective-C中,一个属性实际上只不过是几个方法,其中一个设置一个实例变量和一个 returns 它。因此,仅将 属性 传递到方法中是行不通的。您需要做的是读取 属性,传递指向结果值的指针,然后用新值修改 属性:
NSValue *videoRect = self.videoRect;
[self drawArea:&videoRect completion:^{
...
self.videoRect = videoRect;
}];