ios appearanceWhenContainedIn 只工作一次

Posted

技术标签:

【中文标题】ios appearanceWhenContainedIn 只工作一次【英文标题】:ios appearanceWhenContainedIn only works once 【发布时间】:2015-02-27 03:09:26 【问题描述】:

在viewDidLoad中,我创建了一个searchBar,将它设置为navigationBar里面的titleView,并调用appearanceWhenContainedIn来获取searchBar里面文字的字体大小。当视图第一次加载时,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

谢谢!

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,我找到了一个对我有用的解决方法。每次创建 UISearchBar 子视图时,您都应该手动获取和设置 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 只工作一次的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别