2017-08-24 174 views
0

我有get property的問題。當我將_videoRect傳遞給drawArea函數時,什麼都不會發生。但是,如果我改變self.videoRect工作完美。將self.property傳遞給函數

我的代碼:

@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函數?

+0

也許這是[合成做什麼](https) ://stackoverflow.com/questions/3266467/what-exactly-does-synthesize-do) – cwschmidt

回答

1

您的-drawArea:completion:方法正在指向NSValue,而self.videoRectNSValue的屬性。在Swift中,你可以通過引用來傳遞這樣的屬性,但在Objective-C中,屬性實際上只不過是一對方法,其中一個方法設置了一個實例變量,另一個方法返回它。所以只需將該屬性傳遞給該方法將不起作用。你需要做的是讀取屬性,傳遞一個指向結果值的指針,然後用新值修改屬性:

NSValue *videoRect = self.videoRect; 
[self drawArea:&videoRect completion:^{ 
    ... 

    self.videoRect = videoRect; 
}];