Как перезагрузить или обновить представление viewController после сохранения файла

Можно ли перезагрузить / обновить представление viewController после сохранения файла в папке документов? Если да, пожалуйста, предложите, как это сделать.

Я пытаюсь сохранить файл в AppDelegate, но поскольку он включает в себя синтаксический анализ XML, он сохраняется только при загрузке представления. Это представление, которое должно отображать содержимое файла. Но так как он загружается до сохранения файла, представление ничего не отображает.

Этот запрос связан с моим вопросом по этой ссылке

Должен ли я поделиться кодом здесь снова?

1 ответ

Решение

Я могу помочь вам в этом процессе. Что вам нужно реализовать:

  1. Когда ваш файл будет записан в хранилище, вы можете опубликовать Notification через NotificationCenter, (Кроме того, вы можете проверить наличие файла непосредственно перед публикацией Notification).
  2. Добавить observer для прослушивания этого Notification через NotificationCenter в вашем ViewController (возможно внутри viewDidLoad()).
  3. Когда вы добавляете observer вам нужно указать selector(метод), который будет вызываться при получении уведомления. Поэтому добавьте метод и укажите его как selector для addObserver.
  4. Выполните необходимые операции в этом методе и в конце метода отметьте view грязный. Обычно это делается с self.view.setNeedsDisplay(), Это сделает перегрузку / обновление части.

РЕДАКТИРОВАТЬ: добавлен пример кода

Здесь я выкладываю соответствующий код. Сосредоточьтесь на комментариях внутри кода.

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    postNotificationAfterFileSave()
    return true
}

func postNotificationAfterFileSave() {
    // do your job with your custom class's method for saving
    // you should get a filepath back
    CustomXMLParser().parseAndSave { (filePath) in
        if FileManager.default.fileExists(atPath: filePath) {
            // if the file exists, post Notification
            NotificationCenter.default.post(name: Notification.Name("FileWrittenCompletion"), object: nil)
        }
    }
}

ViewController.swift

@IBOutlet weak var myLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    // add an observer for your Notification and specify a selector that will be called when Notification is got
    NotificationCenter.default.addObserver(self, selector: #selector(updateUI), name: Notification.Name("FileWrittenCompletion"), object: nil)
    myLabel.text = "File is being saved"
}

@objc func updateUI() {
    // this method will be called when Notification happens
    // change your UI objects according to your needs
    myLabel.textColor = #colorLiteral(red: 0.8078431487, green: 0.02745098062, blue: 0.3333333433, alpha: 1)
    myLabel.text = "File is saved successfully"
    // Finally mark your view `dirty` that will do the reloading task of the UI
    self.view.setNeedsDisplay()
}

CustomXMLParser.swift

func parseAndSave(completion: @escaping (String)-> Void ) {
    let when = DispatchTime.now() + 10
    DispatchQueue.global().asyncAfter(deadline: when) {
        let string = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."
        // get the document directory
        let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("myFile").appendingPathExtension("txt")

        do {
            // write to filepath
            try string.write(to: fileURL!, atomically: true, encoding: .utf8)

            DispatchQueue.main.async {
                // return the filePath through completion block
                completion((fileURL?.path)!)
            }

        } catch {
            print("\(error.localizedDescription)")
        }

    }
}
Другие вопросы по тегам