使用 NotificationCenter 在 swift 3 添加观察者

sky*_*guy -1 ios notificationcenter swift swift3

我知道 NotificationCenter 已更改,并且我已查找如何使用此链接将其更改为新的实现: Swift 3 上的 NotificationCenter 问题,但我仍然无法让我的工作!我正在使用课堂教科书做我班上的作业,这是我目前的班级:

//
//  ViewController.swift
//  Persistence
//
//  Created by Skyleguy on 10/31/16.
//  Copyright © 2016 Skyleguy. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet var lineFields: [UITextField]!

    override func viewDidLoad() {
        super.viewDidLoad()
        let filePath = self.dataFilePath()
        if (FileManager.default.fileExists(atPath: filePath))
        {
            let array = NSArray(contentsOfFile: filePath) as! [String]
            for i in 0 ..< array.count
            {
                lineFields[i].text = array[i]
            }
        }

        let notificationName = Notification.Name("applicationWillResignActive")
        NotificationCenter.default.addObserver(self, selector: #selector(Persistence.applicationWillResignActive(notification: NSNotification)), name: notificationName, object: nil)
        // Do any additional setup after loading the view, typically from a nib.
    }

    func applicationWillResignActive(notification: NSNotification)
    {
        let filePath = self.dataFilePath()
        let array = (self.lineFields as NSArray).value(forKey: "text") as! NSArray
        array.write(toFile: filePath, atomically: true)
    }
}
Run Code Online (Sandbox Code Playgroud)

在这一切之后,我仍然收到一个错误:

“模块“持久性”没有名为“applicationWillResignActive”的成员”

请帮忙!

mat*_*att 5

首先,这一行是错误的:

let notificationName = Notification.Name("applicationWillResignActive")
Run Code Online (Sandbox Code Playgroud)

拥有 Notification.Name 的全部意义在于您使用现有的常量,即.UIApplicationWillResignActive.

其次,你的整个表达Persistence.applicationWillResignActive(...)都是胡说八道。这不是#selector. 此函数是 的一部分self,因此只需使用函数名即可。

所以,像这样:

NotificationCenter.default.addObserver(self, 
    selector: #selector(applicationWillResignActive), 
    name: .UIApplicationWillResignActive, 
    object: nil)
Run Code Online (Sandbox Code Playgroud)