2016-11-01 2 views
-2

Я понимаю, что NotificationCenter изменился, и я посмотрел, как изменить его на новую реализацию, используя эту ссылку: NotificationCenter issue on Swift 3, но я все еще не могу заставить мое работать! Я делаю задание из моего класса, используя текстовый класс книги, и это мой класс до сих пор:Использовать NotificationCenter для добавления Observer в swift 3

// 
// 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) 
    } 
} 

после всего этого я все еще получаю ошибку:

«Модуль„Постоянство“имеет не член по имени 'applicationWillResignActive' '

, пожалуйста, помогите!

+0

"Я понимаю, что NotificationCenter изменилось" Тогда вы понимаете, не так. Это совсем не изменилось. – matt

ответ

-2

Ваше уведомление неправильно назван в Swift 3 это изменилось на следующее:

NSNotification.Name.UIApplicationWillResignActive 

Это даст вам правильное имя для наблюдателя.

Другое дело, ваш селектор является неправильным, пожалуйста, попробуйте следующее:

#selector(ViewController.applicationWillResignActive(notification:)) 
+0

Обе вещи, которые вы сказали, неверны. Все дело в том, что вы не должны сказать «Notification.Name», потому что Свифт знает, что это _is_ a «Notification.Name». И ваш '# selector' не является более законным как функция, чем OP; это больше похоже на объявление функции. – matt

+0

@matt Я согласен, однако не стоит писать «Notification.Name». С помощью селектора я считаю, что он должен включать '(Notification:)', как заявляет объявление функции. – Wink

+0

Тогда вы считаете неправильным, и в любом случае это не то, что вы написали в своем ответе. То, что вы не скомпилируете. Это не вопрос мнения или убеждений. – matt

4

Во-первых, эта линия не так:

let notificationName = Notification.Name("applicationWillResignActive") 

Все дело в том, Notification.Name является то, что вам используйте существующую константу, которая составляет .UIApplicationWillResignActive.

Во-вторых, все ваше выражение Persistence.applicationWillResignActive(...) - чепуха. Это не how you form a function reference для #selector. Эта функция является частью self, поэтому просто используйте имя функции как можно чище и просто.

Так что, как это:

NotificationCenter.default.addObserver(self, 
    selector: #selector(applicationWillResignActive), 
    name: .UIApplicationWillResignActive, 
    object: nil) 
Смежные вопросы