【发布时间】:2012-05-17 21:27:16
【问题描述】:
我目前正在使用的应用程序正在使用普通 NSSlider 控制 QuickTime 电影中的位置。就像那里的每个媒体播放器一样。
我想将滑块的值绑定到电影位置(在 0 到 1 的范围内)以避免粘/粘代码。
当我在 UI 中拖动滑块时,会调用正确的设置器,但由于某种原因,当我以编程方式更改值时滑块没有得到更新。 我会说我了解绑定的原理以及 KVC 的工作原理。而且我还知道,当您以编程方式更改值时,您必须使用 getter 或 setter,或者您必须使用 [self willChangeValueForKey:@"theKey"] 和 [self didChangeValueForKey:@"theKey"] 通知观察者。
由于某种原因,这仍然不起作用。 我在 getter 中也有一些日志语句。它甚至没有被调用一次!
我无法真正解释这种行为的原因可能是什么。 唯一的一点是,这与在网上(以及 Aaron Hillegass 的书中)找到的简单示例有点不同的是,我使用的是密钥路径而不是简单的密钥。
我从 IB 转到具有 activeMovie 属性的 App Delegate。 activeMovie 是类 VS_Movie 的一个实例,它有一个 moviePosition 属性。所以我的关键路径是:self.activeMovie.moviePosition,Xcode 似乎也能找到。
如果提供任何提示和帮助,我将不胜感激! 提前致谢
这是我正在使用的一些代码:
1。属性声明
// ivar
NSNumber* _moviePosition;
// Property
@property (retain) NSNumber* moviePosition;
2。 Getter 和 setter 实现
- (NSNumber*) moviePosition
{
NSLog(@"MoviePosition returned : %lf", [_moviePosition doubleValue]);
return _moviePosition;
}
- (void) setMoviePosition:(NSNumber*)newPos
{
NSLog(@"New MoviePosition : %lf", [newPos doubleValue]);
if ( _moviePosition && [newPos isEqualToNumber:_moviePosition] )
return;
if ( _moviePosition )
[_moviePosition release];
_moviePosition = [newPos retain];
if ( _positioningReady )
{
_positioningReady = NO;
TimeValue newMovieTime = (TimeValue)([_moviePosition doubleValue] *
(double)_clipDurationTimeValue);
SetMovieTimeValue(_qtMovie, newMovieTime);
[_movieView displayCurrentFrameOfMovie:self];
// Post a notification to inform the observing
// classes so they can do the neccessary handling.
NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
[nc postNotificationName:VS_MoviePositionChangedNotification
object:self];
}
}
3。调用函数
- (void) setTimeValue:(TimeValue) value withTimeScale:(TimeScale) scale
{
SetMovieTimeValue(_qtMovie, value);
SetMovieTimeScale(_qtMovie, scale);
double newMoviePosition = (double)GetMovieTime(_qtMovie, NULL) / (double)_clipDurationTimeValue;
[self setMoviePosition:[NSNumber numberWithDouble:newMoviePosition]];
[_movieView displayCurrentFrameOfMovie:self];
}
【问题讨论】:
-
关键路径不应该以“self.”开头,但我不知道这是问题所在。显示属性声明,如果未合成,则显示应用程序委托类中的
activeMove和VS_Movie类中的moviePosition的实现。另外,您实际使用的是 setter 还是-will/DidChangeValueForKey:?如果是后者,请显示执行此操作的代码。位置是否在后台线程上更新?最后,你为什么不使用内置的电影播放器/控制器视图? -
我正在构建一个专业用途的应用程序。内置的电影播放器/控制器视图无法提供我需要的东西。将更新帖子并添加一些代码。
标签: objective-c cocoa cocoa-bindings key-value-observing key-value-coding