Как я могу сохранить свои данные, которые идут от одного ViewController к другому? - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь создать приложение-напоминание.Я прошел какой-то путь, но застрял в этом «спасительном» шаге.У меня есть два viewControllers.Один для того, где я регистрирую свою задачу, и другой для того, где хранить эти задачи.Это работает нормально, но как только я перезапускаю приложение, оно исчезает.Я видел много учебных пособий и описаний того, как решить эту проблему, но ни одного из них для моего случая, когда мне нужно вызвать «метод сохранения» на нажатие кнопки на одном VC, а затем сохранить / загрузить их в виде таблицы вдругой VC.

Есть ли кто-нибудь, у кого есть какие-либо советы или ссылки, где я могу прочитать об этом, или какие-либо идеи о том, как я мог бы решить эту проблему?

Вот как выглядят виды(очень просто).

Вид, в котором вы зарегистрированы, данные в полях сохраняются:

The View where you registered, the data in the fields are being saved

Второй Vc с TableView, в котором хранятсяdata:

The second Vc with the TableView which store the data

Вот некоторый код для первого Vc (тот, из которого вы добавляете / регистрируете новую задачу):

//
//  ViewControllerNew.swift
//  easy reminder 2
//
//  Created by Andreas Sjöstedt on 2019-02-04.
//  Copyright © 2019 Andreas Sjöstedt. All rights reserved.
//

import UIKit

class ViewControllerNew: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var TaskTextField: UITextField!
    @IBOutlet weak var todaysdate: UILabel!
    @IBOutlet weak var currenttime: UILabel!

    @IBAction func timeSlider(_ sender: UISlider) {
        currenttime.text = String(Int(sender.value))
    }

    @IBAction func SavedButtonPressed(_ sender: Any) {
        ToDoController.addTodo(newTodo: TaskTextField.text! + " " + currenttime.text! + " " + todaysdate.text!)
        // code for add the data in TableView on Edit Site
    }

    var LableTTF = String()

    override func viewDidLoad() {
        super.viewDidLoad()

        getCurrentDate()
        // the current date text//

        getSingle()
        // acces the calendar//

        getCurrentTime()
        // the current time lable//

        TaskTextField.delegate = self
        // the task-text-lable//

        NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "MyNoteName"), object: nil, queue: OperationQueue.main) { (Notification) in
            let dateVc = Notification.object as! ViewControllerDate
            self.todaysdate.text = dateVc.formattedDate
            // notification reciever
        }
    }

    func getCurrentDate(){
        let formatter = DateFormatter()
        formatter.dateStyle = .short
        //formatter.timeStyle = .medium
        formatter.dateFormat = "dd-MM-yyyy"
        let str = formatter.string(from: Date())
        todaysdate.text = str
        // code for showing current date //
    }

    func getCurrentTime(){
        let formatter = DateFormatter()
        formatter.dateStyle = .short
        formatter.dateFormat = "HH:mm"
        let str = formatter.string(from: Date())
        currenttime.text = str
        // code for showing current time //
    }

    func getSingle(){
        let date = Date()
        let calendar = Calendar.current
        _ = calendar.component(.year, from: date)
        _ = calendar.component(.month, from: date)
        _ = calendar.component(.day, from: date)
        // code for access the calendar //// code for passing the data to other view //
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        TaskTextField.resignFirstResponder()
        return true
        //Hide keyboard when press "klar"//
    }
}

И вотВот некоторый код для другого Vc (который содержит TableView, в котором хранятся данные:

//
//  ViewControllerEdit.swift
//  easy reminder 2
//
//  Created by Andreas Sjöstedt on 2019-02-04.
//  Copyright © 2019 Andreas Sjöstedt. All rights reserved.
//

import UIKit

class ViewControllerEdit: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var tableView: UITableView!

    override func viewDidAppear(_ animated: Bool){
        super.viewDidAppear( animated )
        tableView.reloadData()
    }

    func numberOfSections(in tableView: UITableView) -> Int{
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        return ToDoController.todosArray.count
    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = ToDoController.todosArray[indexPath.row]
        cell.textLabel?.textColor = .white
        return cell
    }

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == UITableViewCell.EditingStyle.delete {
            ToDoController.removeTodo(atIndex:  indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)
        }
    }
}

Извините, здесь также есть некоторый код для контроллера ToDo, если именно здесь нужно добавить эту функцию:


    //
//  ToDoController.swift
//  easy reminder 2
//
//  Created by Andreas Sjöstedt on 2019-02-12.
//  Copyright © 2019 Andreas Sjöstedt. All rights reserved.
//

import UIKit

class ToDoController: NSObject {

    static var todosArray:Array<String> = []

    class func addTodo( newTodo:String){
        ToDoController.todosArray.append(  newTodo)
    }

    class func removeTodo(atIndex:Int) {
        ToDoController.todosArray.remove(at: atIndex)
    }
}

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Вам необходимо реализовать делегат протокола для этой проблемы. Используйте этот код, чтобы получить решение для этой проблемы. Надеюсь, оно вам поможет.

import UIKit

protocol ViewControllerNewDelegate {
    func callBackFromViewControllerNew(_ myData:[String:Any])
}

class ViewControllerNew: UIViewController, UITextFieldDelegate {

    weak var delegate: ViewControllerNewDelegate?


    @IBAction func SavedButtonPressed(_ sender: Any) {
        // code for add the data in TableView on Edit Site
        delegate.callBackFromViewControllerNew(//Pass dictionary here)
    }

}

Примечание: - определите ViewControllerNewDelegate, напишите функцию callBackFromViewControllerNew и не используйтеt забыл написать Delegte = Self , когда перейти к ViewControllerNew

class ViewControllerEdit: UIViewController, UITableViewDelegate, UITableViewDataSource, ViewControllerNewDelegate {

    func goToViewControllerNew (){
        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
        let vc = storyBoard.instantiateViewController(withIdentifier: "ViewControllerNew") as! ViewControllerNew
        vc.delegate = self
        self.navigationController?.pushViewController(vc, animated: true)
    }    

    func callBackFromViewControllerNew(_ myData:[String:Any]){
        print(myData) // get data here from ViewControllerNew
    }        
}
0 голосов
/ 24 февраля 2019

Проблема в сохранении вашего метода хранения.

static var todosArray:Array<String> = []

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

Для этого есть несколько вариантов: Базовые данные, база данных sqlite, UserDefaults.Последнее является наименее подходящим решением здесь, однако его также проще всего реализовать, и я думаю, что это то, что вы хотите сейчас.

extension UserDefaults {

    private static let todoKey = "ToDoKey" // name under which todo data are stored

    func addTodo(_ todo: String, date: Date) {
        var todos = allTodos() // mutable reference to be able to change its content
        todos.append((todo, date))

        set(todos, forKey: UserDefaults.todoKey)
    }

    func removeTodo(at index: Int) {
        guard index < numberOfTodos() else { return }

        var todos = allTodos()
        todos.remove(at: index)

        set(todos, forKey: UserDefaults.todoKey)
    }

    func todoValue(at index: Int) -> String? {
        guard index < numberOfTodos() else { return nil }

        return allTodos()[index].0 // retrieve the first value of a tuple
    }

    func todoDate(at index: Int) -> Date? {
        guard index < numberOfTodos() else { return nil }

        return allTodos()[index].1 // retrieve the second value of a tuple
    }

    func numberOfTodos() -> Int {
        return allTodos().count
    }

    private func allTodos() -> [(String, Date)] {
        let todos = object(forKey: UserDefaults.todoKey) as? [(String, Date)]
        return todos ?? [(String, Date)]()
    }

}

Таким образом, вы можете заменить статический массив следующим образом:

class ToDoController: NSObject {

    class func addTodo( newTodo:String) {
        UserDefaults.standard.addTodo(newTodo, Date())
    }

    class func removeTodo(atIndex:Int) {
        UserDefaults.standard.removeTodo(at: atIndex)
    }
}

Чтобы задать конкретную задачу:

UserDefaults.standard.todoValue(at: index)
UserDefaults.standard.todoDate(at: index)
0 голосов
/ 22 февраля 2019

Вы сохраняете данные в ToDoController, но вы не упомянули здесь его код.Проблема должна быть в этом.Возможно, вы не сохраняете данные в ToDoController.Ваш ToDoController хранит данные до тех пор, пока приложение не станет активным.Когда вы убиваете приложение, ваш контроллер отключается и обрабатывает данные.Если вам нужны постоянные данные, вы должны использовать Plist, Userdefaults или Coredata.Для получения постоянных данных см. ссылка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...