将数据从tableviewcontroller发送到detailviewcontroller

时间:2017-03-11 19:10:31

标签: ios swift3

我有一个名为DetailTableViewController的tableviewcontroller,我需要将数据传递给名为DetailTableViewController的下一个tableviewcontroller。但是我需要在用户单击DetailTableViewController的单元格时传递数据。然后,我得到错误“在展开可选值时意外地发现了nil。”请帮我在Swift 3中解决。

4 个答案:

答案 0 :(得分:2)

  • 首先,在这种情况下,从不从视图(单元格)获取数据,始终从模型(数据源数组)获取数据。

  • 其次,prepare(for segue的签名对于Swift 3来说是错误的。

didSelectRowAt传递indexPath而不是self时,您也可以删除valueToPass

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "Cell", sender: indexPath)
}

prepareForSegue中从模型中获取数据并将其传递给详细视图控制器:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "Cell" {
        let viewController = segue.destination as! GuidesDetailsTableViewController
        let indexPath = sender as! IndexPath
        viewController.passedValue = guides[indexPath.row]
    }
}

答案 1 :(得分:1)

首先在详细视图控制器中创建一个变量,以保存从第一个视图控制器发送的值。然后在第一个视图控制器中的didSelectRowAt方法内分配值,然后以编程方式导航。这样,您就不需要实现prepare for segue方法来发送数据。

您只需要实现didselectrowat方法。

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let selected = firstArray[indexPath.row]
        let detailvc = self.storyboard?.instantiateViewController(withIdentifier: "DetailTableViewController") as! DetailTableViewController

        detailvc.type = selected
        self.present(detailvc, animated: true, completion: nil)

    }

我从头开始为您创建视频教程。 how to pass data from one table view controller to another。希望这会对你有所帮助。

答案 2 :(得分:0)

当你调用performSegue时,似乎var valueToPass没有值。尝试使用以下代码分配valueToPass的值:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    valueToPass = guides[indexPath.row]
    performSegue(withIdentifier: "Cell", sender: self)
}

从viewController创建你的segue,也许你从单元格创建segue。

enter image description here

答案 3 :(得分:0)

2017-03-11 19:52:59.157 WARN 65154 --- [nio-8080-exec-8] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 42001, SQLState: 42001 2017-03-11 19:52:59.157 ERROR 65154 --- [nio-8080-exec-8] o.h.engine.jdbc.spi.SqlExceptionHelper : Syntax error in SQL statement "INSERT INTO LOGGER T[*] (T.REDIRECT, T.USER.ID) VALUES (?,?) "; expected "., (, DIRECT, SORTED, DEFAULT, VALUES, SET, (, SELECT, FROM"; SQL statement: insert into Logger t (t.redirect, t.user.id) VALUES (?,?) [42001-190] 2017-03-11 19:52:59.181 ERROR 65154 --- [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [insert into Logger t (t.redirect, t.user.id) VALUES (?,?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement] with root cause org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "INSERT INTO LOGGER T[*] (T.REDIRECT, T.USER.ID) VALUES (?,?) "; expected "., (, DIRECT, SORTED, DEFAULT, VALUES, SET, (, SELECT, FROM"; SQL statement: insert into Logger t (t.redirect, t.user.id) VALUES (?,?) [42001-190] at org.h2.engine.SessionRemote.done(SessionRemote.java:624) ~[h2-1.4.190.jar:1.4.190] at org.h2.command.CommandRemote.prepare(CommandRemote.java:68) ~[h2-1.4.190.jar:1.4.190] at org.h2.command.CommandRemote.<init>(CommandRemote.java:45) ~[h2-1.4.190.jar:1.4.190] at org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:494) ~[h2-1.4.190.jar:1.4.190] at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1188) ~[h2-1.4.190.jar:1.4.190] at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:72) ~[h2-1.4.190.jar:1.4.190] at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:276) ~[h2-1.4.190.jar:1.4.190] at org.apache.tomcat 内,您需要设置新的 didSelectRow 。删除它应该可以解决问题。

indexPath