1

当我setDelegate_在我的 pyObjC 代码中调用时,我得到一个AttributeError: 'tuple' object has no attribute 'setDelegate_'.

我的代码如下所示:

def createMovie(self):
        attribs = NSMutableDictionary.dictionary()
        attribs['QTMovieFileNameAttribute'] = '<My Filename>'
        movie = QTMovie.alloc().initWithAttributes_error_(attribs, objc.nil)
        movie.setDelegate_(self)

编辑

我发现我不能对电影对象使用任何实例方法。

4

2 回答 2

2

选择器“initWithAttributes:error:”在 Objective-C 中有两个参数,第二个是传递引用的输出参数。Python 没有按引用传递的参数,因此 PyObjC 将该值作为第二个返回值返回,这就是该选择器的 Python 包装器返回一个元组的原因。这是一种通用机制,也可与其他具有按引用传递参数的方法一起使用。

在 Objective-C 中:

QTMovie* movie;
NSError* error = nil;

movie = [[QTMovie alloc] initWithAttributes: attribs error:&error]
if (movie == nil) {
   // do something with error 
}

在 Python 中:

movie, error = QTMovie.alloc().initWithAttributes_error_(attribs, None)
if movie is None:
  # do something with error
于 2012-11-20T14:05:35.957 回答
1

从您的评论来看,它看起来QTMovie.alloc().initWithAttributes_error_实际上返回了一个双元素元组,其中您想要的对象作为第一个元素,而其他对象在第二个元素中(可能是错误?)

您应该能够像这样访问您的对象:

(movie, error) = QTMovie.alloc().initWithAttributes_error_(attribs, objc.nil)
于 2012-08-26T19:49:11.803 回答