1. ホーム
  2. ios

[解決済み] Swiftの外観WhenContainedIn

2022-08-15 07:51:06

質問

自分のアプリをSwift言語に変換しようとしています。

このようなコード行があります。

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

Swiftに変換するには?

Appleのドキュメント では、そのようなメソッドはありません。

どのように解決するのですか?

iOS 9にアップデートしてください。

iOS 9+ (Xcode 7 b1 時点) をターゲットにしている場合、新しいメソッドが UIAppearance プロトコルに新しいメソッドがあり、これは可変長引数を使用しません。

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

というように使うことができる。

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

それでもiOS8以前をサポートする必要がある場合は、以下のオリジナル回答をご利用ください。

iOS 8 & 7 の場合です。

Obj-CのvarargsメソッドはSwiftと互換性がないため、これらのメソッドは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