如何在普通 UIViewController 中使用 UITableView
本系列文章 《Swift on iOS 学习笔记》 将以不定长度、不定内容、不定形式的方式对外发布,主要记录一些 “可重用” 的知识,感谢你的阅读。
在继承自 UIViewController 的普通页面中使用 UITableView 是一种非常普遍的需求,因为 UITableViewController 的可定制性是很差的。话不多说,马上开始:
1. 新建 Application
2. 添加一个 Table View
3. 在 Table View 上添加一个 Table View Cell
4. 在左侧选中该 Table View Cell,并赋予它 Identifier
左侧,点击选中:
右侧,在 Identifier 框里面输入小写的 cell ,输入完成后记得按 Enter 确认:
5. 将该 Table View 绑定到代码
取名为 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. 运行:
8. 总结
此 firstTableView 只是页面上一个普通的 view,可以直接调整他大小和位置,也可以随意增加其他 view。
← Auto Layout 使用心得(一)—— 初体验
如何修改 UINavigationController、UINavigationBar 中 navigationItem 左侧 “返回” 按钮的名称 →
评论:
uQaing
2015-12-07 10:35
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! 请问怎么回事
(lldb) 然后断点在 firstTableView.delegate = self 似乎没有初始化 fistTableView实例 可是我已经经过storyboard 添加了 @IBOutlet weak var member: UITableView! 请问怎么回事
uQaing
2015-12-08 09:53
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
// }
里还是不行
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
2015-10-23 11:56
hello.寒哥。对于autolayout 我有个问题请教。
我的controller的xib里有若干子视图(这些子视图经过自动布局,大小是不固定的),而这些子视图(其一myView)我需要单独封装并用xib来实现(而且一个xib文件里可能有好几个view,以供有选择的加载)。
然后,我在controller的viewdidload方法里,我用静态方法生成一个myView实例(静态方法里已经加载过xib了),这样,我用[self.sonView addsubuview:myview];用来加载这个自定义的view。但是尺寸是对应不上的。
请问这个思路有什么问题。怎样才能达到我想要的这种效果——自定义的view,完美贴合自动布局后的controller里的子视图。
谢谢!
我的controller的xib里有若干子视图(这些子视图经过自动布局,大小是不固定的),而这些子视图(其一myView)我需要单独封装并用xib来实现(而且一个xib文件里可能有好几个view,以供有选择的加载)。
然后,我在controller的viewdidload方法里,我用静态方法生成一个myView实例(静态方法里已经加载过xib了),这样,我用[self.sonView addsubuview:myview];用来加载这个自定义的view。但是尺寸是对应不上的。
请问这个思路有什么问题。怎样才能达到我想要的这种效果——自定义的view,完美贴合自动布局后的controller里的子视图。
谢谢!
2016-01-21 13:40
能否举个例子说一下? 小弟之前也纠结过这个问题, 一直没解决.
( 究竟是继承UIViewController, 再使用UITableView ??? 还是直接继承UITableViewController ??? )
跪求大神解答!