Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 布局中的奇怪异常_Xcode_Swift_Autolayout - Fatal编程技术网

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中是否可用:

  • 检查文档
  • 检查Objective-C中的头文件(通过右键单击该值,然后选择“跳转到定义”找到)
  • 还有一种方法可以查看您使用的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);
    
    工具书类
    • Xcode文档(iOS 8.2)
    • 苹果公司“将Swift与可可和Objective-C结合使用”iBooks
    看看这个答案是否有用:@isim不,我验证,只是它
    s SDK iOS8可以;t编译
    UILayoutPriorityDefaultLow`。mb我打电话的方法不对吗?奇怪的回答,看起来像个借口。但请在swift文件中声明:let LayoutPriorityDefaultRequired:UILayoutPriorityDefaultHigh:UILayoutPriorityDefault750 let LayoutPriorityDefaultLow:UILayoutPriority=250