将数据从uitableview传递到其他uiview

时间:2017-02-20 15:18:01

标签: ios swift uitableview segue

我是swift和IOS的新手,我将字典数据传递给其他uiview有什么问题,有人可以帮我解决吗?

LessonsTableViewController:

var mylessons = [
    ["title":"Posture", "subtitle":"Set up your body", "bgimage":"1", "lesimage":"l1"],
    ["title":"Breathing", "subtitle":"Breathing deeply", "bgimage":"2", "lesimage":"l2"],
    ["title":"Breathing", "subtitle":"Breathing Exercise", "bgimage":"3", "lesimage":"l3"],
    ["title":"Health", "subtitle":"Do’s & Don’ts", "bgimage":"4", "lesimage":"l4"]
]

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! LessonsTableViewCell

    let lessonsObject = mylessons[indexPath.row]

    cell.backgroundImageView.image = UIImage(named: lessonsObject["bgimage"]!)
    cell.titleLabel.text = lessonsObject["title"]
    cell.subtitleLabal.text = lessonsObject["subtitle"]

    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "LessonSegue", sender: mylessons[indexPath.row])
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?){
    let lessegue = segue.destination as! LessonDetailsViewController
    lessegue.SelectedLessons = mylessons
}

LessonDetailsViewController:

    @IBOutlet weak var LTitle: UILabel!

var SelectedLessons = [Dictionary<String, String>()]

override func viewDidLoad() {
    super.viewDidLoad()
    LTitle.text = SelectedLessons["title"]
    // Do any additional setup after loading the view.
}

最后,它有一个错误&#34;无法下标类型的值&#39; [Dictionary]&#39;索引类型&#39;字符串&#39;。

3 个答案:

答案 0 :(得分:1)

首先, SelectedLessons 是错误的类型。你需要使用类似tis的东西

var SelectedLessons:Dictionary<String, String>?

你需要过去正确的对象。

override func prepare(for segue: UIStoryboardSegue, sender: Any?){
    let lessegue = segue.destination as! LessonDetailsViewController
    lessegue.SelectedLessons = sender as? Dictionary<String,String>
}

答案 1 :(得分:0)

您应该声明

var SelectedLessons = [String, String]()

您当前的声明是一系列词典

答案 2 :(得分:0)

你有很多问题。

首先是编码风格问题。变量名称应以小写字母开头,因此SelectedLessons应为selectedLessons

其次,您可能希望将用户选择的课程传递到目标,而不是整个阵列。

您的数组mylessons是一个字典数组:(类型[[String:String]]

您应该在LessonDetailsViewController selectedLesson(单数,从小写字母开头)中命名该变量,并将其设为[String: String]类型(单一课程。)

然后你的prepareForSegue可能如下所示:

override func prepare(for segue: UIStoryboardSegue, sender: Any?){
    guard  
      let lessegue = segue.destination as? LessonDetailsViewController,
      let selectedRow = tableView.indexPathForSelectedRow?.row else {
        print("Error. No row selected. Exiting."
        fatalError()
      }
    lessegue.selectedLesson = myLessons[selectedRow]
}

(对于没有选定行的情况,上面的代码应该有更好的错误处理,但它应该给你一个想法。)

编辑:

顺便说一下,编写prepare(for:)方法并不是一个好主意,就好像你只会想到单一类型的单个视图控制器一样。返回并扩展应用程序以添加其他segue非常常见,如果您这样做,上面的代码将崩溃。最好使用switch语句:

override func prepare(for segue: UIStoryboardSegue, sender: Any?){
    switch segue.destination {
      case let lessegue as LessonDetailsViewController:
        guard  
        let selectedRow = tableView.indexPathForSelectedRow?.row else {
          print("Error. No row selected. Exiting."
          fatalError()
        }
        lessegue.selectedLesson = myLessons[selectedRow]
      default:
        print("Unrecognized segue. Exiting."
        fatalError()
    }
}

该语法创建一个switch语句,其中每个case都是根据目标视图控制器的类型执行的,并且内置强制转换为目标类型。它是switch语句的一个巧妙变体,在prepare(for:)函数中非常有用。