尝试调用此方法:
avatarIconImageView.setContentHuggingPriority(UILayoutPriorityDefaultLow, forAxis: UILayoutConstraintAxis.Horizontal)
并抓住这个例外:
这意味着什么?架构armv7的未定义符号:
" _UILayoutPriorityDefaultLow",引自: __TFC13TCProject_iOS36TCAvatarWithCounterUniversalCellView22configureBodyCellViewsfS0_FT_T_ 在TCAvatarUniversalCellView.o ld:找不到符号 架构armv7 clang:错误:链接器命令失败,退出代码 1(使用-v查看调用)
答案 0 :(得分:20)
这看起来像是iOS 8 SDK中的一个错误。你可以通过传入一个原始值来解决这个问题。
在你的情况下
avatarIconImageView.setContentHuggingPriority(250, forAxis: UILayoutConstraintAxis.Horizontal)
答案 1 :(得分:7)
这不是错误。期望将Objective-C库导入Swift是一个缺点。应该理解Swift如何从Objective-C向Swift导入代码(甚至从Apple UIKIt Libraries)。
UILayoutPriority是一个浮点数。在Objective-C中,为我们预先定义了几个值。预定义的值似乎是枚举。我们可能期望在Swift中可以使用相同的枚举。
文档提出了一个枚举:
宣言 SWIFT
typealias UILayoutPriority = Float
目标-C
enum {
UILayoutPriorityRequired = 1000,
UILayoutPriorityDefaultHigh = 750,
UILayoutPriorityDefaultLow = 250,
UILayoutPriorityFittingSizeLevel = 50,
};
typedef float UILayoutPriority;
但是在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 enum只能包含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导入作为Swift枚举的任何标有NS_ENUM宏的C样式枚举。这意味着枚举值名称的前缀在导入Swift时会被截断,无论它们是在系统框架中定义还是在自定义代码中定义。
摘自:Apple Inc.“将Swift与Cocoa和Objective-C一起使用。”iBooks。 https://itun.es/us/1u3-0.l
这意味着如果使用NS_ENUM宏将UILayoutPriority 定义为整数,则它将作为Swift枚举导入Swift。这是UILayoutConstraintAxis的情况。
宣言 SWIFT
enum UILayoutConstraintAxis : Int {
case Horizontal
case Vertical
}
目标-C
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中可用:
还有一种方法可以查看您习惯使用的typedef是常量还是枚举。在代码中,测试以查看常量的地址是否存在。常量有一个内存地址,而枚举没有。请参阅下面的代码。
// 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);