我正在尝试将我的应用程序转换为Swift语言。
我有这行代码:
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:textDictionary forState:UIControlStateNormal];
如何将其转换为Swift?
在Apple的文档中,没有这种方法。
如果您的目标是iOS 9+(从Xcode 7 b1开始),则UIAppearance协议中有一个不使用varargs 的新方法:
UIAppearance
static func appearanceWhenContainedInInstancesOfClasses(containerTypes: [AnyObject.Type]) -> Self
可以这样使用:
UITextField.appearanceWhenContainedInInstancesOfClasses([MyViewController.self]).keyboardAppearance = .Light
如果您仍然需要支持iOS 8或更早版本,请使用以下原始答案回答此问题。
这些方法不适用于Swift,因为Obj-C varargs方法与Swift不兼容(请参见http://www.openradar.me/17302764)。
我写了一个在Swift中可以使用的非变通方法(我对重复了相同的方法UIBarItem,但它并非来自UIView):
UIBarItem
UIView
// UIAppearance+Swift.h #import <UIKit/UIKit.h> NS_ASSUME_NONNULL_BEGIN @interface UIView (UIViewAppearance_Swift) // appearanceWhenContainedIn: is not available in Swift. This fixes that. + (instancetype)my_appearanceWhenContainedIn:(Class<UIAppearanceContainer>)containerClass; @end NS_ASSUME_NONNULL_END
-
// UIAppearance+Swift.m #import "UIAppearance+Swift.h" @implementation UIView (UIViewAppearance_Swift) + (instancetype)my_appearanceWhenContainedIn:(Class<UIAppearanceContainer>)containerClass { return [self appearanceWhenContainedIn:containerClass, nil]; } @end
只要确保您#import "UIAppearance+Swift.h"在桥接标题中即可。
#import "UIAppearance+Swift.h"
然后,从Swift调用(例如):
# Swift 2.x: UITextField.my_appearanceWhenContainedIn(MyViewController.self).keyboardAppearance = .Light # Swift 3.x: UITextField.my_appearanceWhenContained(in: MyViewController.self).keyboardAppearance = .light