uiViewController 中的 uiTableView:缺少某些东西

Posted

技术标签:

【中文标题】uiViewController 中的 uiTableView:缺少某些东西【英文标题】:uiTableView in uiViewController: something's missing 【发布时间】:2016-08-16 02:19:42 【问题描述】:

我的桌子下面需要​​一个工具栏,所以我在这里。

xcode 7.3.1 斯威夫特 2

我在基本视图控制器中添加了一个表格视图。

我将delegatedatasource 出口从表格视图拖到情节提要中的视图控制器。

我将一个表格单元格拖到我的表格视图中。我将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 并再次显示

iOS中的UITab冻结

TableView 上的搜索栏不起作用

Swift TableView 不返回 numbersOfRow

我们如何为多个 UITab 使用相同的 WKWebView

如何跳转到iOS开发中另一个UITab下的其他UINavigationController?