我搜索并使用了
UIDevice.currentDevice().instancesRespondToSelector(Selector("userInterfaceIdiom"))
但不能为我工作。将错误显示为
'的UIDevice'没有名为' instancesRespondToSelector`
的成员
也尝试了这个
UIDevice.instancesRespondToSelector(Selector("userInterfaceIdiom"))
但是出现错误
'的UIDevice'没有名为' userInterfaceIdiom'
的成员
但是UIDevice属于NSObject,它有成员instancesRespondToSelector
?请指出我的错误或建议正确的方法吗?
答案 0 :(得分:4)
instancesRespondToSelector
仍然是类方法,绝对不是实例方法:
UIDevice.instancesRespondToSelector(Selector("userInterfaceIdiom"))
<强>更新#1 强>
因为userInterfaceIdiom
只是实例的属性:
UIDevice.currentDevice().respondsToSelector(Selector("userInterfaceIdiom"))
答案 1 :(得分:2)
首先,您不需要这个特定的选择器检查。仅在[[UIDevice] currentDevice] userInterfaceIdiom]
检查后调用respondsToSelector
的建议可以追溯到iOS 3.x.那时,运行iOS 3.1的iPhone没有userInterfaceIdiom
方法 - 只有运行iOS 3.2的iPad才有。
不仅没有人试图支持iOS 3.x了,你也无法使用Swift部署它。您可以从Xcode 6定制的所有iOS版本(无论您是使用Swift还是ObjC编写)都支持调用userInterfaceIdiom
,就此而言,您可以从Xcode 5中定位所有版本。
其次,没有必要写Selector("someSelectorName")
。 Selector
类型采用StringLiteralConvertible
协议,因此只要您看到采用Selector
的API,就可以传递字符串文字。
所以,你可以写:
UIDevice.instancesRespondToSelector("userInterfaceIdiom")
或
UIDevice.currentDevice().respondsToSelector("userInterfaceIdiom")
但你不应该......
最后,使用userInterfaceIdiom
进行布局决策通常是一个坏主意 - 首先,每当您想要使用相同的视图控制器作为肖像时,它会导致错误的布局决策 - iPhone上的全屏幕视图和iPad上的拆分视图中的主视图。
在iOS 8中,视图控制器适应其所呈现的框架的首选方式是使用特征。在视图控制器代码中,写下这样的内容:
if self.traitCollection.horizontalSizeClass == .Compact {
// lay out for iPhone portrait or iPad master-split / popover
} else {
// lay out for iPad detail-split / fullscreen
}
您可以在WWDC 2104 session 216: Building Adaptive Apps with UIKit中获得有关设计自适应视图控制器的更多信息。
答案 2 :(得分:1)
从@holex提示,我意识到答案为
UIDevice.respondsToSelector(Selector("userInterfaceIdiom"))
答案 3 :(得分:0)
我认为应该是这样的:
UIDevice.userInterfaceIdiom?()