4

我正在使用现有代码。这里在 .h 文件中声明了一个 popovercontroller,它在实现行中给了我错误。

.h 文件

@property (nonatomic, strong)   VFImagePickerController     *imagePicker;
@property (nonatomic, strong)   UIPopoverController         *popoverController;
@property (nonatomic, strong)   UINavigationController      *targetVC;

.m 文件:
错误

请建议如何解决这个问题。

4

4 回答 4

12

看来您的类是UIViewController. UIViewController有一个私有的、无证的 ivar _popoverController。由于您试图在您的类中创建一个具有相同名称的 ivar,因此您会收到错误消息。

最简单的方法是将您的popoverController属性重命名为不同的名称。否则,您的应用可能会因使用私有 API 而被标记。

于 2013-02-25T18:30:36.437 回答
9

出现此问题是因为您的超类 UIViewController 已经有一个名为_popoverController. 因此,无论是默认综合还是您的显式(注释)@synthesize指令都无法访问他们想要用来提供popoverController属性的实例变量。

您可以通过重命名属性或显式合成属性以使用不同的实例变量名称来解决此问题:

// Either
@property (nonatomic, strong) UIPopoverController *localPopoverController
// Or
@synthesize popoverController = _localPopoverController;

(另请注意,“本地”前缀不一定是您的属性名称或实例变量的最佳实践;请花一点时间考虑您的首选命名约定并适当地选择一个属性/实例变量名称。)

于 2013-02-25T18:30:29.453 回答
3

取消注释合成行并删除下划线,如下所示:@synthetize popoverController;

并将 .m 文件中的每个 _popoverController var 名称替换为 popoverController

于 2013-02-25T18:30:57.173 回答
0

不要命名您的实例变量(或属性)popoverController。如上所述 UIViewController 有一个声明为 _popoverController 的实例变量。(谁知道为什么。)

明智的做法是不要给您的弹出框控制器起一个通用名称,因为例如,如果您决定向工具栏添加多个弹出框,则必须创建多个弹出框控制器才能完成此操作。

如果您查看 Apple 的示例代码,您会看到他们是如何做到这一点的:

http://developer.apple.com/library/ios/#samplecode/Popovers/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010436

查看 DetailViewController 中的私有属性部分。在那里,您将看到三个控制器对象,但没有一个通用名称为“popoverController”。这将导致问题。

于 2013-03-31T02:37:47.323 回答