如何在两个视图之间动态更改字体?

How to change fonts dynamically between two views?

我有两个 UIViewController(ViewController 和设置ViewController)。

在设置中ViewController 我有 3 个按钮,当按下这些按钮时应该更改主 ViewController.

中 UITextView 的字体

我正在使用 NSUserDefaults。但是,它只在第一次起作用或根本不起作用。

我认为问题是当我从设置视图返回主视图时,视图没有重新加载。

我该怎么做?

SettingViewController.swift

class SettingsViewController: UIViewController {

 var handWritingOption: String?
    var zapfinoOption: String?
    var systemOption: String?


@IBAction func handWritingPressed(sender: AnyObject) {

        handWritingOption = "1"
        zapfinoOption = "0"
        systemOption = "0"

        NSNotificationCenter.defaultCenter().postNotificationName("load", object: nil)
        NSUserDefaults.standardUserDefaults().setObject(handWritingOption, forKey: "handWritingBool")
        NSUserDefaults.standardUserDefaults().setObject(zapfinoOption, forKey: "zapfinoBool")
        NSUserDefaults.standardUserDefaults().setObject(systemOption, forKey: "systemBool")
        NSUserDefaults.standardUserDefaults().synchronize()

    }

    @IBAction func zapfinoPressed(sender: AnyObject) {

        handWritingOption = "0"
        zapfinoOption = "1"
        systemOption = "0"

        NSNotificationCenter.defaultCenter().postNotificationName("load", object: nil)
        NSUserDefaults.standardUserDefaults().setObject(handWritingOption, forKey: "handWritingBool")
        NSUserDefaults.standardUserDefaults().setObject(zapfinoOption, forKey: "zapfinoBool")
        NSUserDefaults.standardUserDefaults().setObject(systemOption, forKey: "systemBool")

    }

    @IBAction func systemPressed(sender: AnyObject) {

        handWritingOption = "0"
        zapfinoOption = "0"
        systemOption = "1"

        NSNotificationCenter.defaultCenter().postNotificationName("load", object: nil)
        NSUserDefaults.standardUserDefaults().setObject(handWritingOption, forKey: "handWritingBool")
        NSUserDefaults.standardUserDefaults().setObject(zapfinoOption, forKey: "zapfinoBool")
        NSUserDefaults.standardUserDefaults().setObject(systemOption, forKey: "systemBool")

    }
}

ViewController.swift

class ViewController: UIViewController {

     @IBOutlet weak var noteResult: UITextView!

var handWritingOption = NSUserDefaults.standardUserDefaults().objectForKey("handWritingBool") as? String
    var zapfinoOption = NSUserDefaults.standardUserDefaults().objectForKey("zapfinoBool") as? String
    var systemOption = NSUserDefaults.standardUserDefaults().objectForKey("systemBool") as? String

override func viewDidLoad() {
        super.viewDidLoad()

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "loadList:",name:"load", object: nil)
 }

func loadList(notification: NSNotification){
        println("Font Changed")

        if handWritingOption  == "1" {

            noteResult.font = UIFont(name: "ThinPencilHandwriting", size: 15)
        }

        if zapfinoOption == "1" {

            noteResult.font = UIFont(name: "Zapfino", size: 15)
        }

        if systemOption == "1" {

            noteResult.font = UIFont(name: "Papyrus", size: 15)
        }
    }

}

它不起作用,因为您正在使用 Notification。如果更改设置时 loadList 的通知未在 ViewController 中注册,则不会更改任何内容。为此,请进行以下修改。

Step 1: 取消使用通知

Step 2: 在你的ViewController

中添加如下方法

Step 3:在viewWillAppear()中调用,如下图

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    // *** Load font value ***
    handWritingOption = NSUserDefaults.standardUserDefaults().objectForKey("handWritingBool") as? String
    zapfinoOption = NSUserDefaults.standardUserDefaults().objectForKey("zapfinoBool") as? String
    systemOption = NSUserDefaults.standardUserDefaults().objectForKey("systemBool") as? String

    // *** call setFonts ***
    self.setFonts()
}

func setFonts()
{
    if handWritingOption  == "1" {

        noteResult.font = UIFont(name: "ThinPencilHandwriting", size: 15)
    }

    if zapfinoOption == "1" {

        noteResult.font = UIFont(name: "Zapfino", size: 15)
    }

    if systemOption == "1" {

        noteResult.font = UIFont(name: "Papyrus", size: 15)
    }
}

每次您的视图出现在屏幕上时,它都会设置字体。