【问题标题】:XCode 'Build for Archive' HUGE errors in CGRectMakeCGRectMake 中的 XCode 'Build for Archive' 巨大错误
【发布时间】:2011-03-12 16:16:31
【问题描述】:

我只是在构建我的 Cocoa 应用程序以在 mac 应用程序商店上分发,但这是我第一次使用“构建和存档”。现在,对于我所有的cgrectmake,它给了我一个构建错误:

error: incompatible type for argument 1 of 'setFrame:'

始终受影响的代码是:

image.frame = cgrectmake(x, y, width, height);

这种情况发生在正常调试中。到底是怎么回事?

顺便说一句,我使用的是 XCode 4,如果这有影响的话

【问题讨论】:

  • 您将需要发布导致错误的实际代码,以便任何人能够帮助您。您还需要引起问题的行周围的上下文,以便我们可以看到所有参数的真实类型。

标签: cocoa xcode macos xcode4


【解决方案1】:

假设您正在为 Mac App Store 构建(如您所说),那么您正在使用 NSImageView。你的问题是 NSImageView 需要一个 NSRect 来设置框架,可以用NSMakeRect(CGFloat x, CGFloat y, CGFloat w, CGFloat h)创建框架

【讨论】:

  • 在 64 位架构上,当 NS_BUILD_32_LIKE_64 在包含标头之前定义时,NSRect 定义为 CGRect,因此 CGRectMakeNSMakeRect 可以互换。 (而且我不明白你是如何推断他正在使用 NSImageView 的。)问题是他拼错了CGRectMake(例如,全小写,如问题所示)或者他正在构建 32 位没有定义那个宏。
  • 因为他说 image.frame(使其成为 imageview)并且他正在为 mac 应用商店制作它,所以它不是 UIImageView。我插入了他拥有的代码,归档时它给了我完全相同的错误。我只是说我的答案是对的。
  • 啊,我错过了变量名。这就说得通了。我们都对,我们的解决方案都可以工作,但问题不在于他必须使用 NSRect。这是一种选择;像 64 位一样构建 32 位(因此可以在 32 位上使用 CGRect)是另一个。
  • 感谢您提供的信息,我真的不知道如何更改为 64 位替代方案。不过感谢 cmets。
  • 我的回答解释了如何像 64 位一样构建 32 位。受影响类型的大小不会改变,只会改变它们的定义方式。
【解决方案2】:

确保您正确拼写CGRectMake。 Objective-C 区分大小写,所以cgrectmake 是一个不同的错误函数名。

此外,如果您正在构建 32 位版本(我假设您将构建发布版本),那么 CG 类型与其对应的 NS 类型不同。 AppKit 使用 NSRect 等类型,在 64 位上定义为 CGRect,但在 32 位上默认不是。在导入 Cocoa.h 之前,在前缀标头中定义 NS_BUILD_32_LIKE_64,以使 NSRect 定义为 CGRect,即使在 32 位架构上也是如此。

定义该宏还有其他影响,特别是关于NSIntegerNSUInteger 的定义。在上传到 App Store 之前进行额外的测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2017-06-27
    相关资源
    最近更新 更多