uiViewController 中的 uiTableView:缺少某些东西
Posted
技术标签:
【中文标题】uiViewController 中的 uiTableView:缺少某些东西【英文标题】:uiTableView in uiViewController: something's missing 【发布时间】:2016-08-16 02:19:42 【问题描述】:我的桌子下面需要一个工具栏,所以我在这里。
xcode 7.3.1 斯威夫特 2
我在基本视图控制器中添加了一个表格视图。
我将delegate
和datasource
出口从表格视图拖到情节提要中的视图控制器。
我将一个表格单元格拖到我的表格视图中。我将reuseIdentifier
设置为“单元格”
我将单元格类型设置为详细信息 表格类型是普通的
这是我自定义的 View Controller 类(它自始至终都有解释性 cmets):
import Foundation
import UIKit
import SwiftyJSON
import Alamofire
class ScheduleViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
let cellIdentifier = "cell" // also tried: let cellIdentifier = "cellIdentifier"
@IBOutlet var tableView: UITableView!
var Titles:Array< String > = Array < String >()
var Details:Array< String > = Array < String >()
override func viewDidLoad()
super.viewDidLoad()
var height = UIApplication.sharedApplication().statusBarFrame.size.height
var insets = UIEdgeInsets(top: height, left: 0, bottom: 0, right: 0)
/* if any of the following four lines are not commented out it throws an error after successful build, in simulator: fatal error: unexpectedly found nil while unwrapping an Optional value */
// self.tableView.contentInset = insets
// self.tableView.scrollIndicatorInsets = insets
// self.tableView.separatorColor = UIColor.grayColor();
// self.tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine;
manager.request(.POST, getUrl(), parameters:["dev": 1]).responseJSON response in
print(response)
var json = JSON(response.result.value!);
print(json)
if !json["logged_in"]
self.performSegueWithIdentifier("LoginController", sender: self)
return;
for (_,subJson):(String, JSON) in json["shifts"]
self.Titles.append(subJson["title"].string!);
self.Details.append(subJson["detail"].string!);
// everything in this async function goes swimmingly until the next line
self.do_table_refresh();
// see do_table_refresh function for error detail
func do_table_refresh()
dispatch_async(dispatch_get_main_queue(),
self.tableView.reloadData() /* < this line here throws the same error as the four lines mentioned above: "fatal error: unexpectedly found nil while unwrapping an Optional value." it builds fine (no error indicated until the simulator gets to the point of running the function) */
return
)
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
func numberOfSectionsInTableView(tableView: UITableView) -> Int
return 1
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return Titles.count
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
cell.textLabel?.text = Titles[indexPath.row]
cell.detailTextLabel?.text = Details[indexPath.row]
if Details[indexPath.row] == "OFF"
cell.textLabel!.textColor = UIColor(red: 214/255, green: 214/255, blue: 214/255, alpha: 1)
cell.detailTextLabel!.textColor = UIColor(red: 214/255, green: 214/255, blue: 214/255, alpha: 1)
else
cell.textLabel!.textColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 1)
cell.detailTextLabel!.textColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 1)
return cell
当我使用 TableView 控制器时,这些功能都可以正常工作,但我需要一个工具栏。
以下五行中的任何一行(前四行在viewDidLoad
函数中找到,最后在do_table_refresh
函数中找到),应用程序将失败(成功构建后):fatal error: unexpectedly found nil while unwrapping an Optional value
// self.tableView.contentInset = insets
// self.tableView.scrollIndicatorInsets = insets
// self.tableView.separatorColor = UIColor.grayColor();
// self.tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine;
// self.tableView.reloadData()
回到 Table View Controller 中,这些行没有给我那个错误,所以我假设 tableView 中的某些内容是空的。
我忽略了什么?
【问题讨论】:
工具栏与您的分隔符有什么关系? 没有。工具栏用于导航和表格的其他选项。此类中没有与工具栏相关的代码。我只需要使用 UIView,因为您无法将工具栏添加到 UITableView。 不能把工具栏拖放进去吗? 不进入 TableView 控制器。不会。Table View Controller 在设计上占据了整个页面,这就是为什么有数百万人在将 Table View 添加到标准 View Controller 时遇到堆栈溢出问题。 是的,我知道,但是您使用的是 UIViewController 而不是 UITableViewController,这样可以将工具栏拖放到其中。 【参考方案1】:在您的 viewDidLoad() 方法中,您需要添加委托和数据源以将您的表链接到视图控制器。
override func viewDidLoad()
super.viewDidLoad()
tableView.delegate = self
tableview.dataSource = self
【讨论】:
避免使用 tableView 作为变量名。连接到您的 IBOutlet 时更改为更具描述性的内容。喜欢 loginTableView。 不,我已经在几个小时前尝试过这个解决方案。不工作。而且我已经在类声明中分配了它们,除了在情节提要中分配它们。【参考方案2】:试试这个。
dispatch_async(dispatch_get_main_queue(),
self.do_table_refresh();
)
【讨论】:
以上是关于uiViewController 中的 uiTableView:缺少某些东西的主要内容,如果未能解决你的问题,请参考以下文章
如果需要,保存 UIViewController 并再次显示