appearanceWainContainedIn在Swift中

Ale*_*xZd 124 ios uiappearance swift

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

我有这行代码:

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
                     setTitleTextAttributes:textDictionary
                                   forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

如何将其转换为Swift?

Apple的文档中,没有这样的方法.

Ale*_*lav 229

iOS 9更新:

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

static func appearanceWhenContainedInInstancesOfClasses(containerTypes: [AnyObject.Type]) -> Self
Run Code Online (Sandbox Code Playgroud)

哪个可以这样使用:

UITextField.appearanceWhenContainedInInstancesOfClasses([MyViewController.self]).keyboardAppearance = .Light
Run Code Online (Sandbox Code Playgroud)

如果您仍需要支持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
Run Code Online (Sandbox Code Playgroud)

-

// UIAppearance+Swift.m
#import "UIAppearance+Swift.h"
@implementation UIView (UIViewAppearance_Swift)
+ (instancetype)my_appearanceWhenContainedIn:(Class<UIAppearanceContainer>)containerClass {
    return [self appearanceWhenContainedIn:containerClass, nil];
}
@end
Run Code Online (Sandbox Code Playgroud)

请确保#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
Run Code Online (Sandbox Code Playgroud)

  • UIBarButtonItem不是UIView,需要单独扩展 (15认同)
  • 请注意,至少在iOS8中,UIAppearance + Swift.h应该导入UIKit/UIKit.h (7认同)

小智 31

ios 10 swift 3

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "Kapat"
Run Code Online (Sandbox Code Playgroud)


Yoi*_*aya 14

对于iOS 8和7:

我使用基于Alex答案的类别来指定多个容器.这是一个解决方法,直到Apple正式支持appearanceWhenContainedInSwift.

UIAppearance + Swift.h

@interface UIView (UIAppearance_Swift)
/// @param containers An array of Class<UIAppearanceContainer>
+ (instancetype)appearanceWhenContainedWithin: (NSArray *)containers;
@end
Run Code Online (Sandbox Code Playgroud)

UIAppearance + Swift.m

@implementation UIView (UIAppearance_Swift)

+ (instancetype)appearanceWhenContainedWithin: (NSArray *)containers
{
    NSUInteger count = containers.count;
    NSAssert(count <= 10, @"The count of containers greater than 10 is not supported.");

    return [self appearanceWhenContainedIn:
            count > 0 ? containers[0] : nil,
            count > 1 ? containers[1] : nil,
            count > 2 ? containers[2] : nil,
            count > 3 ? containers[3] : nil,
            count > 4 ? containers[4] : nil,
            count > 5 ? containers[5] : nil,
            count > 6 ? containers[6] : nil,
            count > 7 ? containers[7] : nil,
            count > 8 ? containers[8] : nil,
            count > 9 ? containers[9] : nil,
            nil];
}
@end
Run Code Online (Sandbox Code Playgroud)

然后添加#import "UIAppearance+Swift.h"到您的桥接标题.

要从Swift中使用:

TextField.appearanceWhenContainedWithin([MyViewController.self, TableViewController.self]).keyboardAppearance = .Light
Run Code Online (Sandbox Code Playgroud)

如果我能找到一种使用CVarArgType的方法很好,但我发现没有干净的解决方案.


Bau*_*aub 12

这是一个不那么丑陋,但仍然很丑陋的解决方案,受到@tdun的启发.

  1. 创建一个类来保存Objective-C外观.出于这个例子的目的,我们来称呼它AppearanceBridger.
  2. 将此类添加到桥接标头中.如果您没有桥接标头,请创建一个.
  3. AppearanceBridgernamed中创建一个类方法,并将+(void)setAppearanceObjective-C外观代码放在此方法中.例如:


+ (void)setAppearance {
    [[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class], nil] setBackgroundColor:[UIColor whiteColor]];
}

  1. 在你设置外观的Swift代码中,打电话AppearanceBridger.setAppearance(),你应该好好去!

希望这适用于看到它的人.