快速填充表格视图
Posted
技术标签:
【中文标题】快速填充表格视图【英文标题】:Populate table view in swift 【发布时间】:2014-10-10 22:57:46 【问题描述】:嗨,我想填充这个 tableview
我不使用静态表格视图,因为我出错了,我决定使用动态表格视图并禁用表格中的滚动。 表格视图仅用于信息:
@IBOutlet var tableInfoQuake: UITableView!
override func viewDidLoad()
super.viewDidLoad()
navigationItem.title = quake.place
tableInfoQuake.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0))?.textLabel?.text = quake.place
tableInfoQuake.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0))?.textLabel?.text = "Mag: \(quake.mag)"
tableInfoQuake.cellForRowAtIndexPath(NSIndexPath(forRow: 1, inSection: 0))?.textLabel?.text = "Cordinate: (\(quake.longitude),\(quake.latitude))"
tableInfoQuake.cellForRowAtIndexPath(NSIndexPath(forRow: 1, inSection: 0))?.textLabel?.text = "Depth: \(quake.depth)"
但在表格视图中,我什么都没有看到。 我能怎么做?谢谢。
编辑:我这样做是为了修改每一行:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
var cellIdentifier = "quakeInfo"
var cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as UITableViewCell
if indexPath == NSIndexPath(forRow: 0, inSection: 0)
cell.textLabel!.text = quake.place
cell.detailTextLabel!.text = "Mag: \(quake.mag)"
if indexPath == NSIndexPath(forRow: 1, inSection: 0)
cell.textLabel!.text = "Cordinate: (\(quake.longitude),\(quake.latitude))"
cell.detailTextLabel!.text = "Depth: \(quake.depth)"
return cell
【问题讨论】:
【参考方案1】:哦,TableViews...
所以,您想要动态填充一个表格视图。嗯……给你我的朋友:
第 1 步:实现数据源
好的....所以你知道什么是协议吗?好吧,如果你不...BAM, now you do(视频中不是我)。 DataSource 是 UITableView 将调用以检索它需要显示的数据。具体来说,有问题的DataSource是UITableViewDataSource。
所以...
// change top to...
class MyViewController:UIViewController, UITableViewDataSource
这使得 UITableViewDataSource 成为 ViewController 的要求。接下来,您需要在 UITableView 上设置数据源。所以....
override func viewDidLoad()
super.viewDidLoad()
navigationItem.title = quake.place
tableInfoQuake.datasource = self
假设您现在要向表格中添加 7 个单元格,并且所有 7 个单元格都会说“Hello Man”。对于这个例子,我将使用最糟糕但最简单的方法。如果你想让我更深入,请在下面评论,我会做得更好。
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return 7
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = UITableViewCell()
let label = UILabel(CGRect(x:0, y:0, width:200, height:50))
label.text = "Hello Man"
cell.addSubview(label)
return cell
这就是第一步。我们已经告诉表格 ViewController 有它正在寻找的数据,并且我们已经返回了数据供它使用。
第 2 步:实现委托
很像第 1 步,这一步从在顶部添加一些东西开始......
// change top to...
class MyViewController:UIViewController, UITableViewDataSource, UITableViewDelegate
然后,再次像顶部一样,我们将编辑 viewDidLoad() 函数...
override func viewDidLoad()
super.viewDidLoad()
navigationItem.title = quake.place
tableInfoQuake.datasource = self
tableInfoQuake.delegate = self
现在我们必须实现指定每个单元格高度的委托方法。
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
return 50
我们现在已经将代理添加到表格中,并实现了告诉 UITableView 每个单元格的高度的方法。
让我们把它们放在一起
class MyViewController:UIViewController, UITableViewDataSource, UITableViewDelegate
@IBOutlet var tableInfoQuake: UITableView!
override func viewDidLoad()
super.viewDidLoad()
tableInfoQuake.datasource = self
tableInfoQuake.delegate = self
// UITableViewDataSource Functions
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return 7
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = UITableViewCell()
let label = UILabel(CGRect(x:0, y:0, width:200, height:50))
label.text = "Hello Man"
cell.addSubview(label)
return cell
// UITableViewDelegate Functions
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
return 50
祝你好运。
ZR
【讨论】:
好的,但是我如何选择一行并处理它,因为两行是不同的。当我实现 func cellForRowAtIndexPath 时,我为每个单元格实现相同的结构,而不是我希望为每一行设置不同的结构。像这样:tableInfoQuake.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0))?.textLabel?。 text = quake.place 和这个:tableInfoQuake.cellForRowAtIndexPath(NSIndexPath(forRow: 1, inSection: 0))?.textLabel?.text = "Cordinate: ((quake.longitude),(quake.latitude))" 在 cellForRowAtIndexPath 中,您将获得 indexPath 参数,该参数告诉您表格正在请求哪个单元格。要处理特定的单元格——例如第二个单元格——你可以这样做 if(indexPath.row == 1) //setup code 非常非常有帮助。请注意,您可能需要将datasource
中的大小写更改为dataSource
。
对于 Swift 3,在创建 UILabel 时使用frame: CGRect(x:0, y:0, width:200, height:50)
。【参考方案2】:
情节提要中的单元格是原型单元格。这意味着它们实际上不在表格视图中,但可以用作模板。
为了填充表格视图,您需要:
-
在情节提要中,通过将“数据源”连接从表视图的连接菜单拖动到视图控制器,将视图控制器设置为表视图的数据源。
使您的视图控制器符合 UITableViewDataSource 协议。
在您的视图控制器中实现以下方法:
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
【讨论】:
使用这种方式你将如何引用tableview来执行刷新数据?还需要 IBOutlet 对吗? 是的,您需要 IBOutlet 来引用 tableview。以上是关于快速填充表格视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在快速向上和向下滚动表格时停止自动重新加载表格视图? [关闭]