如何在普通 UIViewController 中使用 UITableView

2015-2-11   /   阅读数:23282   /   分类: iOS & Swift

本系列文章 《Swift on iOS 学习笔记》 将以不定长度、不定内容、不定形式的方式对外发布,主要记录一些 “可重用” 的知识,感谢你的阅读。

在继承自 UIViewController 的普通页面中使用 UITableView 是一种非常普遍的需求,因为 UITableViewController 的可定制性是很差的。话不多说,马上开始:

1. 新建 Application

Image

2. 添加一个 Table View

Image

3. 在 Table View 上添加一个 Table View Cell

Image

4. 在左侧选中该 Table View Cell,并赋予它 Identifier

左侧,点击选中:

Image

右侧,在 Identifier 框里面输入小写的 cell ,输入完成后记得按 Enter 确认:

Image


5. 将该 Table View 绑定到代码

Image

取名为 firstTableView。

6. 修改代码

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var firstTableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        firstTableView.delegate = self
        firstTableView.dataSource = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 2
    }
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell
        
        cell.textLabel.text = "我是第 \(indexPath.row) 个Cell"
        
        return cell
    }


}

7. 运行:

Image

8. 总结

此 firstTableView 只是页面上一个普通的 view,可以直接调整他大小和位置,也可以随意增加其他 view。

WRITTEN BY

avatar

评论:

Chakery
2016-01-21 13:40
"在继承自 UIViewController 的普通页面中使用 UITableView 是一种非常普遍的需求,因为 UITableViewController 的可定制性是很差的。"

能否举个例子说一下? 小弟之前也纠结过这个问题, 一直没解决.
( 究竟是继承UIViewController, 再使用UITableView ??? 还是直接继承UITableViewController ??? )

跪求大神解答!
haha
2017-09-30 17:29
@Chakery:继承自UIViewController,但要声明UITableViewController的两个协议
uQaing
2015-12-07 10:35
您好 按照你的步奏 总是在运行的时候出现fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb) 然后断点在 firstTableView.delegate = self  似乎没有初始化 fistTableView实例  可是我已经经过storyboard 添加了 @IBOutlet weak var member: UITableView!  请问怎么回事
JohnLui
2015-12-07 11:08
@uQaing:建议在 StoryBoard 中新建 View Controller 重试,这里面可能的问题太多了。
uQaing
2015-12-08 09:53
@JohnLui:你好  我刚才又按照你说的新建view controller 重试了 还是不行。然后搜索到一篇文章 说的是IBOutlet 初始化过程,写得比较乱 我也没太看明白,大概是说 IBOutlet 自动初始化对象的是和再代码里viewDidLoad() 里初始化的时间不一样 我的程序里比你的多了一个UITabBarController,tableview是显示在其中的一个子 viewcontroller里。于是我新建了一个只有一个ViewController 作为root的 结果没有报错 IBOutlet 初始化成功。 我就在想是不是,真的是因为
UITabBarController影响了IBOutlet初始化对象的时间顺序。如果是 该怎么解决呢?
另外我尝试
//     override func viewWillAppear(animated: Bool) {
//        firstTableView.delegate = self
//        firstTableView.dataSource = self
//    }
    
//    override func viewDidAppear(animated: Bool) {
//        firstTableView.delegate = self
//        firstTableView.dataSource = self
//    }
里还是不行
BruceJong
2015-10-23 11:56
hello.寒哥。对于autolayout 我有个问题请教。
我的controller的xib里有若干子视图(这些子视图经过自动布局,大小是不固定的),而这些子视图(其一myView)我需要单独封装并用xib来实现(而且一个xib文件里可能有好几个view,以供有选择的加载)。
然后,我在controller的viewdidload方法里,我用静态方法生成一个myView实例(静态方法里已经加载过xib了),这样,我用[self.sonView addsubuview:myview];用来加载这个自定义的view。但是尺寸是对应不上的。
请问这个思路有什么问题。怎样才能达到我想要的这种效果——自定义的view,完美贴合自动布局后的controller里的子视图。
谢谢!
JohnLui
2015-10-23 12:36
@BruceJong:不要叫寒哥,那是别人。。。。。
JohnLui
2015-10-23 12:38
@BruceJong:可以尝试给子视图使用这个 view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
BruceJong
2015-10-23 13:13
@JohnLui:谢谢~ 我需要设置一下自定义视图view的frame(而且frame的大小和父视图等大)再配合你说的方法,设置一下mask。就可以解决了。  
不叫你寒哥了。

发表评论:

© 2011-2019 岁寒  |  Powered by Emlog