iOS开发----TableView基础

343 阅读5分钟

本文讲的是TableView基础,如何填充数据。

专业完整版请参考(www.appcoda.com/learnswift/)

上面网址的教程文档为试用版,需要购买。(支持正版从我做起💪)

各位看官注意啦,本文章不是教程,只是我的一个分享而已,有错误还请指出。

先上效果图

接下来我们开始!
注意本文是基于iOS 12和Xcode 10


删除原有框架,使用列表框架

如何创建的项目步骤就略过了,使用是单视图。
我们要做的在Main.storyboard删除原有的视图控制器,替换为我们想要的列表控制器(在Library)
下图为更改前和更改后

细心的人可能看到了 在右边我的故事版(姑且叫故事版 具体名字我也忘了)里原来的ViewConntroller文件变成了RestaurantViewConntroller文件。

原因是因为原来的文件是继承与被我们删除的视图控制器,所以它也要被我们删除,重新建立一个新的文件继承于我们现在的列表控制器。

建立步骤如下图

首先在文件夹这里,点击New File,之后点击默认的Cococa Touch Class,在之后的界面中名字随意取,但是Subclass of 要改成UITableViewController。
最后修改我们列表视图中的Class,为我们新建的文件,也就是让他们两者关联。

添加数据在列表中

第一步 我们要做的是修改列表的布局,这里就随个人爱好修改,没有强制规定😂。

以上是我的界面,顺手把cell标识符也修改了,之后我们会用到。

在右边的Attributs 中的有个Identlfler修改

第二步 我们要把相册和数据都填充到我们图片框和标签框里
在我们之前新建的文件里找到以下函数

  • override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
 这个函数的作用就是修改我们列表行中的内容。

接下来我们要做的是建立四个数组,分别用来存放图片,名字,地点,餐馆类型。

这里我们要注意的是,如果你要添加图片无论一张还是几张,图片数组中要填充你图片的名称。并且把图片放到右边故事版的Assets.xcassets中。

接着我们就可以敲代码啦,目光转移tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)这个函数上。

首先我们要让代码知道我们是那个列表,所以我们之前设置的标识符就派上用场了。

我之前设置了标识符为datacell,所以我要定义一个常量A存放我的标识符,之后我们在定义一个常量B来管理我们的列表,最后在用常量B来使各个标签栏中显示我们数组中的内容。

好! 思路完成。 接下来就是代码啦,下面将贴出代码,如果觉得自己能力,可以自己先完成。

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cellIdentifier = "datacell"
        let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath)
        // Configure the cell...

        cell.textLabel?.text = restaurantNames[indexPath.row]
        cell.imageView?.image = UIImage(named: restaurantImages[indexPath.row])
        return cell
    }

除此之外,我们还要修改两个函数并修改至下图

  override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return restaurantNames.count

第一个函数的作用是告诉这个列表视图(table view)我们只有一个列表(此函数这里也可以注释,因为此函数默认返回的是 1)

第二个函数的作用是为了返回数组中的个数

这时候你就可以使用模拟器看下样子了,结果可能你会很失望,打开App会是一片漆黑。

为什么会是这样呢?原因在于我们故事版中的主要存储版中(Main.storedboard),我们之前删除了默认的,新建了一个列表控制器。

但并没有把它设置为初始的视图控制器,如图设置。

这是我们再打开模拟器看看会发生什么事。

如果你只是想填充数据的话,到这里就已经结束了,我们已经成功添加了图片和名字。

但是这样子并不完美,我们还要继续对它进行加工,让名字显示到标签栏上还要显示地点和类型。

加工App

先新建一个文件,步骤就不用多说了吧,唯一的区别是Subclass of 改为UITableViewCell。

再然后是使列表区域(datacell)与其关联。

打开新建的文件,输入以下内容,也就是相应的与其他四个对应。

    @IBOutlet var nameLable: UILabel!
    @IBOutlet var LocationLable: UILabel!
    @IBOutlet var TypeLable: UILabel!
    @IBOutlet var ImageView: UIImageView!

在主要故事版中,右击cell(我们这里已经命名为datacell),拖拽定义的变量到相应的地方。

我们返回RestaurantUITableViewController的文件来更新我们的代码。

由于在之前文件已经定义四个新的常量来对应四个地方,我们想要用到这个四个常量就需要是我们cell 跟这个文件相关联。

修改代码至如下

let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! RestaurantTableViewCell

接下来就可以愉快把数组中的内容放到对应的地方了!

        cell.nameLabel.text = restaurantNames[indexPath.row]
        cell.thumbnailImageView.image = UIImage(named: restaurantImages[indexPath.row])
        cell.locationLabel.text = restaurantLocations[indexPath.row]
        cell.typeLabel.text = restaurantTypes[indexPath.row]

再次打开模拟器,出现下图效果达成。

至此我们目的达成! 本文完结!

如果出现界面排版混乱,可以给图片大小固定成某一个值,并且把内容模版改成Scale to Fill

还有很多内容值得大家探讨,比如修改图片的形状等。

以后会持续缓慢的更新,毕竟本人也是还在学习的小白。