我是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;。
答案 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:)
函数中非常有用。