Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 滑块上的值绑定don';不能正确更新_Objective C_Cocoa_Cocoa Bindings_Key Value Observing_Key Value Coding - Fatal编程技术网

Objective c 滑块上的值绑定don';不能正确更新

Objective c 滑块上的值绑定don';不能正确更新,objective-c,cocoa,cocoa-bindings,key-value-observing,key-value-coding,Objective C,Cocoa,Cocoa Bindings,Key Value Observing,Key Value Coding,我目前正在使用的应用程序使用普通的NSSlider控制QuickTime电影中的位置。就像所有的媒体播放器一样 我想将滑块的值绑定到电影位置(在0到1的范围内),以避免粘代码 当我在UI中拖动滑块时,会调用右边的setter,但由于某些原因,当我以编程方式更改值时,滑块不会得到更新。 我想说我理解绑定的原理以及KVC是如何工作的。我还知道,当您以编程方式更改值时,您必须使用getter或setter,或者使用[self-Will ChangeValueForkey:@“theKey”]和[sel

我目前正在使用的应用程序使用普通的NSSlider控制QuickTime电影中的位置。就像所有的媒体播放器一样

我想将滑块的值绑定到电影位置(在0到1的范围内),以避免粘代码

当我在UI中拖动滑块时,会调用右边的setter,但由于某些原因,当我以编程方式更改值时,滑块不会得到更新。 我想说我理解绑定的原理以及KVC是如何工作的。我还知道,当您以编程方式更改值时,您必须使用getter或setter,或者使用[self-Will ChangeValueForkey:@“theKey”]和[self-didChangeValueForKey:@“theKey”]通知观察者

出于某种原因,这仍然不起作用。 我在getter中还有一些日志语句。它甚至一次也没叫过

我真的无法解释自己这种行为的原因是什么。 唯一不同于在线(以及Aaron Hillegass的书中)找到的简单示例的是,我使用的是一个键路径,而不是一个简单的键

从IB,我转到具有activeMovie属性的应用程序委托。activeMovie是具有moviePosition属性的类VS_Movie的实例。所以我的关键路径是:self.activeMovie.moviePosition,Xcode似乎也能找到它

如果您能提供任何提示和帮助,我将不胜感激! 提前谢谢

以下是我正在使用的一些代码:

1.财产申报 2.Getter和setter实现 3.调用函数
假定属性名为
moviePosition
,则getter应称为
-moviePosition
(无下划线),setter应称为
-setMoviePosition:
(无下划线,属性名称的第一个字母大写)

您没有显示
@属性
声明。虽然允许指定setter和getter的名称,但KVC和KVO都没有注意到这一点。对于他们来说,需要遵循命名约定。看

你确定你所说的是正确的二传手吗?由于您将访问器方法命名错误,编译器无法识别它们。因此,
@synthesis
正在生成正确命名的。这些被KVC调用(并被KVO钩住)


这也是为什么
-setTimeValue:withTimeScale:
不调用
[self-setMoviePosition:newMoviePosition]
,这与您的
-set\u moviePosition:
方法不匹配。但是,您应该会收到一个警告(并且在运行时会出现崩溃),因为您正在将一个
double
传递给一个setter,该setter需要一个
NSNumber*

密钥路径不应该以“self”开头,但我不知道这是问题所在。显示app delegate类中的
activeMove
VS\u Movie
类中的
moviePosition
的属性声明和实现(如果未合成)。另外,您实际使用的是setter还是
-will/DidChangeValueForKey:
?如果是后者,则显示执行该操作的代码。职位是否在后台线程上更新?最后,为什么不使用内置的电影播放器/控制器视图?我正在构建一个专业应用程序。内置的电影播放器/控制器视图不能提供我需要的东西。将更新帖子并添加一些代码。我很抱歉。在从Xcode复制粘贴代码时,我做了一些小改动,没有修复试用和错误代码。请检查上面更新的代码。同时,我将在提供的链接上阅读该文档。非常感谢!新代码看起来好多了,但现在我想知道它是否反映了导致您所问的奇怪行为的情况。也许你无意中解决了这个问题。我现在看到的问题是:
@synthesis
是多余的,因为您提供了访问器实现。在getter名称处有一个反勾(`)。setter中的内存管理稍微关闭。您无法防止
newPos
\u moviePosition
相同。在发布
\u moviePosition
之前,您应该保留
newPos
,或者将整个方法括在
if(newPos!=\u moviePosition)
中。好的,修复了内存错误并删除了@synthesis指令。谢谢你的提示。不幸的是,这并没有改变任何事情。当我使用accessor方法更改代码,然后调用setter获取新值时,NSSlider应该得到通知,对吗?我不明白为什么这不起作用。你有没有可能有两个单独的app delegate类实例?也许一个在NIB中实例化,一个在代码中实例化?没有。但我刚刚意识到,每次打开一部新电影时,activeMovie实例都在变化。绑定是用KVO建立的,对吗?但是,当观察到的对象(关键路径的一个组件)发生变化时会发生什么?
// ivar
NSNumber* _moviePosition;

// Property
@property (retain) NSNumber* moviePosition;
- (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];
    }
}
- (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];
}