Xcode 布局中的奇怪异常
尝试调用此方法:Xcode 布局中的奇怪异常,xcode,swift,autolayout,Xcode,Swift,Autolayout,尝试调用此方法: avatarIconImageView.setContentHuggingPriority(UILayoutPriorityDefaultLow, forAxis: UILayoutConstraintAxis.Horizontal) 抓住这个例外: 架构armv7的未定义符号: “\u UILayoutPriorityDefaultLow”,引用自: __TFC13TCProject\u IOS36TCAVATARwith Counter UniversalCellView
avatarIconImageView.setContentHuggingPriority(UILayoutPriorityDefaultLow, forAxis: UILayoutConstraintAxis.Horizontal)
抓住这个例外:
架构armv7的未定义符号:“\u UILayoutPriorityDefaultLow”,引用自: __TFC13TCProject\u IOS36TCAVATARwith Counter UniversalCellView22配置BodyCellViews SFS0\u FT\T_ 在TCAvatarUniversalCellView.o ld中:找不到的符号 架构armv7 clang:错误:链接器命令失败,退出代码为 1(使用-v查看调用)
这是什么意思?这看起来像是iOS 8 SDK中的一个bug。您可以通过传入一个原始值来解决这个问题
- UILayoutPriorityDefaultRequired=1000
- UILayoutPriorityDefaultHigh=750
- UILayoutPriorityDefaultLow=250
avatarIconImageView.setContentHuggingPriority(250, forAxis: UILayoutConstraintAxis.Horizontal)
这不是一个bug。这是期望将Objective-C库导入Swift的一个缺点。应该理解Swift是如何将代码(甚至来自Apple UIKIt库)从Objective-C导入Swift的 UILayoutPriority是一个浮点数。在Objective-C中,为我们预定义了几个值。预定义值似乎是一个枚举。我们可能会期望在Swift中提供相同的枚举 文档建议使用枚举: 声明 迅捷的 目标-C
enum {
UILayoutPriorityRequired = 1000,
UILayoutPriorityDefaultHigh = 750,
UILayoutPriorityDefaultLow = 250,
UILayoutPriorityFittingSizeLevel = 50,
};
typedef float UILayoutPriority;
enum {
UILayoutConstraintAxisHorizontal = 0,
UILayoutConstraintAxisVertical = 1
};
typedef NSInteger UILayoutConstraintAxis;
但在Xcode中,如果您要求查看其中一个枚举值的定义(例如UILayoutPriorityRequired),您将看到它们实际上在头文件中定义为常量浮点
typedef float UILayoutPriority;
static const UILayoutPriority UILayoutPriorityRequired NS_AVAILABLE_IOS(6_0) = 1000; // A required constraint. Do not exceed this.
static const UILayoutPriority UILayoutPriorityDefaultHigh NS_AVAILABLE_IOS(6_0) = 750; // This is the priority level with which a button resists compressing its content.
static const UILayoutPriority UILayoutPriorityDefaultLow NS_AVAILABLE_IOS(6_0) = 250; // This is the priority level at which a button hugs its contents horizontally.
因此,尽管我们可能喜欢将预定义的布局优先级视为枚举值(如文档所示),但布局优先级并不是真正定义为枚举;它们被定义为常量浮动
对于任何了解C编程语言的人来说,提示是C枚举只能包含int值。以下内容是合法的,将汇编:
enum myEnum {
JGCEnum_one = 1,
JGCEnum_two,
JGCEnum_three
} JGCEnum;
但我们不能真正将浮点定义为C枚举的值。以下内容将不会编译:
enum myEnum {
JGCEnum_one = 1.5, // compilation error
JGCEnum_two,
JGCEnum_three
} JGCEnum;
Objective-C枚举与C枚举相同(Swift枚举不同)。知道我们是在处理实际的整数还是浮点数是很重要的。因为可以使用NS_ENUM宏定义整数,然后可以将其作为Swift枚举导入Swift
iBook说
Swift将使用NS_ENUM宏标记的任何C样式枚举作为Swift枚举导入。这意味着枚举值名称的前缀在导入Swift时会被截断,无论它们是在系统框架中定义的还是在自定义代码中定义的
摘自:苹果公司《将Swift与可可和Objective-C结合使用》iBooks
这意味着,如果使用NS_ENUM宏将UILayoutPriority定义为整数,则它将作为Swift ENUM导入Swift。UILAYOUT出租车就是这样
声明
迅捷的
目标-C
enum {
UILayoutPriorityRequired = 1000,
UILayoutPriorityDefaultHigh = 750,
UILayoutPriorityDefaultLow = 250,
UILayoutPriorityFittingSizeLevel = 50,
};
typedef float UILayoutPriority;
enum {
UILayoutConstraintAxisHorizontal = 0,
UILayoutConstraintAxisVertical = 1
};
typedef NSInteger UILayoutConstraintAxis;
查看Objective-C头文件可以确认文档中所说的内容
//
// UIView Constraint-based Layout Support
//
typedef NS_ENUM(NSInteger, UILayoutConstraintAxis) {
UILayoutConstraintAxisHorizontal = 0,
UILayoutConstraintAxisVertical = 1
};
因此,至少有两种方法可以知道您在Objective-C中使用的预定义值在Swift中是否可用:
// this line will compile and run just fine.
// UILayoutPriorityDefaultHigh is a constant and has a memory address
// the value will be true if the device is running iOS 6.0 or later
// and false otherwise
BOOL predefinedValueIsAvailable = (NULL != &UILayoutPriorityDefaultHigh);
// this line will not compile
// UILayoutConstraintAxisHorizontal is an enum (NOT a constant)
// and does not have a memory address
predefinedValueIsAvailable = (NULL != &UILayoutConstraintAxisHorizontal);
工具书类
- Xcode文档(iOS 8.2)
- 苹果公司“将Swift与可可和Objective-C结合使用”iBooks李>
s SDK iOS8可以;t编译
UILayoutPriorityDefaultLow`。mb我打电话的方法不对吗?奇怪的回答,看起来像个借口。但请在swift文件中声明:let LayoutPriorityDefaultRequired:UILayoutPriorityDefaultHigh:UILayoutPriorityDefault750 let LayoutPriorityDefaultLow:UILayoutPriority=250