小编典典

出现在Swift中

swift

我正在尝试将我的应用程序转换为Swift语言。

我有这行代码:

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
                     setTitleTextAttributes:textDictionary
                                   forState:UIControlStateNormal];

如何将其转换为Swift?

Apple的文档中,没有这种方法。


阅读 287

收藏
2020-07-07

共1个答案

小编典典

iOS 9更新:

如果您的目标是iOS 9+(从Xcode 7 b1开始),则UIAppearance协议中有一个不使用varargs 的新方法:

static func appearanceWhenContainedInInstancesOfClasses(containerTypes: [AnyObject.Type]) -> Self

可以这样使用:

UITextField.appearanceWhenContainedInInstancesOfClasses([MyViewController.self]).keyboardAppearance = .Light

如果您仍然需要支持iOS 8或更早版本,请使用以下原始答案回答此问题。

对于iOS 8和7:

这些方法不适用于Swift,因为Obj-C
varargs方法与Swift不兼容(请参见http://www.openradar.me/17302764)。

我写了一个在Swift中可以使用的非变通方法(我对重复了相同的方法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"在桥接标题中即可。

然后,从Swift调用(例如):

# Swift 2.x:
UITextField.my_appearanceWhenContainedIn(MyViewController.self).keyboardAppearance = .Light

# Swift 3.x:
UITextField.my_appearanceWhenContained(in: MyViewController.self).keyboardAppearance = .light
2020-07-07