приложението, с което работя в момента, контролира позицията във филм QuickTime с нормален NSSlider. Точно както във всеки медиен плейър там.
Исках да свържа стойността на плъзгача с позицията на филма (която е в диапазон от 0 до 1), за да избегна залепващ/залепващ код.
Когато плъзгам плъзгача в потребителския интерфейс, правилният сетер се извиква, но по някаква причина плъзгачът не се актуализира, когато променя стойността програмно. Бих казал, че разбирам принципите на обвързването и как работи KVC. И също така знам, че трябва или да използвате гетери или сетери, или трябва да уведомите наблюдателите с [self willChangeValueForKey:@"theKey"] и [self didChangeValueForKey:@"theKey"], когато промените стойностите програмно.
По някаква причина това все още не работи. Също така имам някои отчети за журнал в getter. Не е извикан дори веднъж!
Не мога да си обясня каква може да е причината за това поведение. Единственото нещо, което е малко по-различно от простите примери, намерени онлайн (и в книгата на Арън Хилегас), е, че използвам ключов път вместо обикновен ключ.
От IB отивам в App Delegate, който има свойство activeMovie. 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];
}
activeMove
в класа делегат на приложението, така и заmoviePosition
в класаVS_Movie
. Също така, какво всъщност използвате, сетери или-will/DidChangeValueForKey:
? Ако последното, покажете кода, който прави това. Актуализира ли се позицията във фонова нишка? И накрая, защо не използвате изгледите на вградения филмов плейър/контролер? - person Ken Thomases   schedule 18.05.2012