【问题标题】:viewDidLoad vs viewWillAppear vs viewDidAppear parts of this code此代码的 viewDidLoad vs viewWillAppear vs viewDidAppear 部分
【发布时间】:2020-05-25 03:26:36
【问题描述】:

我正在尝试从我下载并尝试在我的代码中使用的项目中处理这段代码。 在 viewDidLoad 中,pickerView 由“新拼图”填充,或者如果用户在以前的 VC 中保存了游戏,则保存的游戏。 按照最初的编写方式,用户保存了游戏,然后通过选择器视图返回到这个控制器。 在我的“mod”中,我将两个 VC 嵌入到导航控制器中,从而获得了一个不错的后退按钮以返回到 pickerView 控制器。 但是,加载pickerView是在viewDidLoad函数中,我的理解是,只加载一次。

有人可以帮助我,viewDidLoad 中的哪些项目需要移动。移动时,他们是否需要进入 viewWillAppear 或 viewDidAppear?我的理解是它应该在 viewWillAppear 中。

override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.title = "Games"

        DispatchQueue.main.async {
            if !Settings.shared.adsEnabled {
                self.removeTableViewHeader()
            } else {
                //self.tableView.layoutTableHeaderView()
            }
        }
        //Picker Stuff
        // Connect data:
            self.picker.delegate = self
            self.picker.dataSource = self


            copyDatabaseIfNeeded("puzzles")
        // open database
            if sqlite3_open(finalDatabaseUrl2.path, &db2) != SQLITE_OK {
                //print("error opening db")
            }
            else{

            }

            pickerData.append("New Puzzle")

        //retrieve all dates from previous puzzles and add them to pickerview
            var queryStatement2 = ""

            queryStatement2 = "SELECT * FROM puzzle;"

            self.statement2 = nil
            if sqlite3_prepare_v2(self.db2,queryStatement2,-1,&self.statement2,nil) == SQLITE_OK{

                while(sqlite3_step(self.statement2) == SQLITE_ROW){
                    let date = sqlite3_column_text(self.statement2,2)
                    let comp = sqlite3_column_text(self.statement2,3)

                    let dateString = String(cString: date!)
                    let compString = String(cString: comp!)

                    pickerData.append("\(dateString) - \(compString)")
                }
            //sqlite3_reset(self.statement2)
                sqlite3_finalize(self.statement2)

            }
        }

【问题讨论】:

  • viewDidLoad() -> viewWillAppear() -> viewDidAppeared()viewDidLoad() 仅在您初始化视图时调用 1 次。当您访问视图时,另一个将调用。如果您希望在访问视图时更改 UI 中的某些内容(该视图之前没有 deinit),请在 viewDidAppeared() 中调用它
  • 感谢国王。我尝试将所有内容移到 //Picker Stuff 下方。但是,现在当我回去时,我得到了两个“新拼图”条目。如果我再次回到根目录并回到这个 VC,我就会得到我想要完成的任务。一个“新谜题”和一个保存。如何摆脱出现的第二个“新谜题”?
  • 这是重复的,因为当您返回 VC 时,您会查询新项目并将其附加到您的选择器。根据您的目的,您可以在 ViewDidLoad() 中初始化 Picker,并且数据可以适应 viewDidAppeared 但不能追加,如果您像这样查询所有内容,则需要设置为数组。不追加
  • 请问可以帮帮我吗?这超出了我目前的知识范围。

标签: ios swift viewdidload viewwillappear viewdidappear


【解决方案1】:
override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.title = "Games"

        DispatchQueue.main.async {
            if !Settings.shared.adsEnabled {
                self.removeTableViewHeader()
            } else {
                //self.tableView.layoutTableHeaderView()
            }
        }
        //Picker Stuff
        // Connect data:
            self.picker.delegate = self
            self.picker.dataSource = self



        }

override func viewDidAppear() {
 copyDatabaseIfNeeded("puzzles")
 pickerData = []
            // open database
                if sqlite3_open(finalDatabaseUrl2.path, &db2) != SQLITE_OK {
                    //print("error opening db")
                }
                else{

                }

                pickerData.append("New Puzzle")

            //retrieve all dates from previous puzzles and add them to pickerview
                var queryStatement2 = ""

                queryStatement2 = "SELECT * FROM puzzle;"

                self.statement2 = nil
                if sqlite3_prepare_v2(self.db2,queryStatement2,-1,&self.statement2,nil) == SQLITE_OK{

                    while(sqlite3_step(self.statement2) == SQLITE_ROW){
                        let date = sqlite3_column_text(self.statement2,2)
                        let comp = sqlite3_column_text(self.statement2,3)

                        let dateString = String(cString: date!)
                        let compString = String(cString: comp!)

                        pickerData.append("\(dateString) - \(compString)")
                    }
                //sqlite3_reset(self.statement2)
                    sqlite3_finalize(self.statement2)

                }
}

你可以像这样更新你的代码。

【讨论】:

  • 我试过了。最初它不允许我覆盖(方法不会覆盖其超类中的任何方法),所以我删除了覆盖。然后运行它,“New Puzzle”没有出现,导致(线程1:致命错误:索引超出范围)。
  • 对不起,我的错误。这是“viewDidAppear()”而不是“viewDidAppeared()”
  • 我以 viewDidAppear 的身份进行操作。那是“新拼图”在按下播放时没有填充并给出错误的时候(因为没有价值可去)。
  • 没有数据填充,因为在您的代码中没有任何东西可以调用您的选择器重新加载数据。在您上面的示例代码中不要包含它。在pickerData append 所有数据之后调用该函数。
  • 如果我解开 segue,viewDidLoad 是否正常工作还是 viewDidAppear 再次出现?
猜你喜欢
  • 2012-02-06
  • 2010-12-07
  • 2012-12-11
  • 2013-05-27
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多