swift:相当于respondsToSelector

时间:2014-06-09 11:12:00

标签: ios swift

我搜索并使用了

UIDevice.currentDevice().instancesRespondToSelector(Selector("userInterfaceIdiom"))

但不能为我工作。将错误显示为

  

'的UIDevice'没有名为' instancesRespondToSelector`

的成员

也尝试了这个

UIDevice.instancesRespondToSelector(Selector("userInterfaceIdiom"))

但是出现错误

  

'的UIDevice'没有名为' userInterfaceIdiom'

的成员

但是UIDevice属于NSObject,它有成员instancesRespondToSelector?请指出我的错误或建议正确的方法吗?

4 个答案:

答案 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?()