本文讲的是TableView点击效果。swift
专业完整版请参考(www.appcoda.com/learnswift/)数组
上面网址的教程文档为试用版,须要购买。(支持正版从我作起💪)app
各位看官注意啦,本文章不是教程,只是个人一个分享而已,有错误还请指出。ide
一样先上效果图函数
接下来咱们开始!
post
注意本文是基于iOS 12和Xcode 10
本章是在基础篇的代码作出的修改,若是未完成,还请先看基础篇。
(juejin.im/post/5d23e3…)spa
添加一个函数,当发生点击的时候调用这个函数,并对它进行填充。rest
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let optionMenu = UIAlertController(title: nil, message: "what do you want to do", preferredStyle: .actionSheet)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
optionMenu.addAction(cancelAction)
present(optionMenu, animated: true, completion: nil)
}
复制代码
咱们再打开模拟器,看看效果如何 code
固然你也能够作本身想要的效果。cdn
若是你想要另外种弹唱的方式能够修改optionMenu中的preferredSyle,相对应的若是要修改按钮(Cancel)的效果,点击cancel中的style。
若是以为有能力的能够继续完成一个练习:当我点击Call时,弹出另外一个对话框。
代码我会在本文最后贴出。
这里咱们要实现的是多选功能,一样要在tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)这个函数中进行,一样十分简单只须要几行代码就能够。
let CheckAction = UIAlertAction(title: "Check in", style: .default, handler: {(action: UIAlertAction) -> Void in
let cell = tableView.cellForRow(at: indexPath)
cell?.accessoryType = .checkmark
})
optionMenu.addAction(CheckAction)
复制代码
再次开启模拟器,咱们会惊奇的发现虽然确实能够选择,可是当咱们下滑时候,下面未选择的列表行也有被选中。
再次上滑时,发现有选中标记的可能不是咱们刚才选中的那个列表行了!
这是一个Bug! 缘由是在iOS开发中,列表并不会创建你所要求的个数,而是在上下滑动的时候重复利用。
好比你数组里面有30个放入列表中,但列表不会创建30个而是可能只创建10个或者其余个数,在上下滑动重复利用,这是为了节省计算机的资源但同时也是形成咱们如今的状况的缘由。
如同教学文档中所说的同样,我讨厌Bug但不能躲避它。
Bug对提高咱们的技术帮助是十分大的。
面对这样的设置,咱们的解决方法是设置一个数组,若是选中则变为true不然为false。 因此咱们先在整个类下定义一个布尔值的数组resraurantIsVisited.
以后在tableView(_ didSelectRowAt:)中函数中添加一串代码
self.restaurantIsVisited[indexPath.row] = true
复制代码
同时在tableView(_ cellForRowAt:)中添加断定代码,为了去除未选中的列表行。
if restaurantIsVisited[indexPath.row]{
cell.accessoryType = .checkmark
} else {
cell.accessoryType = .none
}
复制代码
再次启动模拟器,选中在滑动发现问题解决了!
至此本文主要内容已经所有结束,你们能够思考这几个问题。
1.点击选中的列表行时Check in变成Undo Check,点击Undo Check取消选中。
2.如今选中的列表行是一个打勾的标记,尝试修改为其余标记。
最后贴出以前练习添加多个代码框的代码:
let CallActionHandler = {(action: UIAlertAction) -> Void in
let alertMessge = UIAlertController(title: "Service Unavailable", message: "Sorry, the call feature is not available yet. Please retry later", preferredStyle: .alert)
alertMessge.addAction(UIAlertAction(title: "OK", style: .default, handler: nil) )
self.present(alertMessge, animated: true, completion: nil)
}
let CallAction = UIAlertAction(title: "Call" + "123-000-\(indexPath.row+1)", style: .default, handler: CallActionHandler)
optionMenu.addAction(CallAction)
复制代码