ios appearanceWhenContainedIn 只工作一次

标签 ios objective-c swift uisearchbar uiappearance

在 viewDidLoad 中,我创建了一个 searchBar,将其设置为 navigationBar 内的 titleView,并调用 appearanceWhenContainedIn 获取 searchBar 内文本的字体大小。当 View 第一次加载时,appearanceWhenContainedIn 工作正常,但是当 viewController 被关闭然后再次推送时,appearanceWhenContainedIn 方法虽然被调用但不起作用。处理 viewDidLoad 中的相同代码,但结果不同。这怎么可能发生?

override func viewDidLoad() {
    super.viewDidLoad()

    var searchBar:UISearchBar = UISearchBar()
    searchBar.frame = CGRect(x: 0, y: 0, width: UIScreen.mainScreen().bounds.width, height: 20)
    searchBar.autocapitalizationType = UITextAutocapitalizationType.None
    searchBar.delegate = self
    searchBar.searchBarStyle = UISearchBarStyle.Minimal
    searchBar.sizeToFit()
    searchBar.tintColor = UIColor.whiteColor()
    searchBar.placeholder = "username"
    searchBar.barTintColor = UIColor.whiteColor()
    searchBar.backgroundColor = UIColor.clearColor()
    self.navigationItem.titleView = searchBar
    AppearanceBridge.setAppearance()
}

代码在 Swift 中,我找不到 Swift 的 appearanceWhenContainedIn,所以我在虚拟类中调用了一个 Objective-C 方法。 (AppearanceBridge.setAppearance())

@import UIKit;
#import "AppearanceBridge.h"

@implementation AppearanceBridge
+ (void)setAppearance {
    [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setFont:[UIFont systemFontOfSize:17]];
    [[UILabel appearanceWhenContainedIn:[UISearchBar class], nil] setFont: [UIFont systemFontOfSize:17]];
    [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor whiteColor]];
}
@end

我包含了 .h 和 .m 文件,因为我没有使用 Objective-C 的经验,代码可能有问题。

#import <Foundation/Foundation.h>

@interface AppearanceBridge : NSObject
+ (void)setAppearance;
@end

谢谢!

最佳答案

我遇到了同样的问题,我找到了一个对我有用的解决方法。每次创建它时,您都应该从 UISearchBar subview 中手动获取 UITextField/UILabel 并为其设置样式。我猜最好创建一个单独的方法。我正在使用 C#,对我来说它看起来像这样:

public static void StyleSearchBar(UISearchBar searchBar)
{
   var container = searchBar.Subviews[0];
   var textField = container.FirstOrDefault(x => x is UITextField);
   textField.BackgroundColor = UIColor.Red;
}

我知道这不是 ObjC 或 Swift 的答案,但我确信这个想法很容易理解。

关于ios appearanceWhenContainedIn 只工作一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28756880/

相关文章:

ios - Webservice 方法未获取第一次单击的值

swift - NSURLErrorDomain 错误消息是否应该出现在 Xcode 控制台中?

Objective-C NSMutableArray removeObjectAtIndex : crashes

iphone - 设备锁定时响应事件

iphone - 获取数字的第一位小数

ios - UIScrollView 在 iOS 7 中没有滚动到底部

objective-c - OSC 库在 iOS6 上使用 ARC

android - IOS Swift 中的应用类

ios - 在 UITableView 中使用带有 [UIImage resizableImageWithCapInsets] 的 UIImageView 会导致延迟

swift - 快速更新表格 View 单元格