【问题标题】:Reloading Table Data in Swift?在 Swift 中重新加载表数据?
【发布时间】:2016-07-17 10:44:37
【问题描述】:

我有一个名为MainTableViewController 的类,还有一个名为MainTableViewIBOutlet。当我尝试在委托函数中重新加载表视图时,我收到一个EXC_BAD_INSTRUCTION 错误,该错误在控制台Fatal Error: found nil while unwrapping an optional value 中读取。

当我在我的类的ViewDidLoad 方法中测试变量MainTableView 时,它不是nil。但是,当我在委托函数中对其进行测试时,它是 nil

我在这里做错了什么?为什么我不能使用插座将表格数据重新加载到表格视图?

即使我尝试使用tableView 而不是MainTableView(我的插座),我也会遇到大量错误,所以一定不是这样。

import UIKit
import SwiftyJSON

class MainTableViewController: UITableViewController, SettingsSidebarViewDelegate {

@IBOutlet var settings: UIBarButtonItem!

@IBOutlet var MainTableView: UITableView!

var NumberofRows = 0
var names = [String]()
var descriptions = [String]()
var categories = [String]()
var types = [String]()
var series = [String]()
var groups = [String]()

func parseJSON(){
    let path =  NSBundle.mainBundle().URLForResource("documents", withExtension: "json")

    let data = NSData(contentsOfURL: path!) as NSData!

    let readableJSON = JSON(data: data)


    NumberofRows = readableJSON["Documents"].count


    for i in 1...NumberofRows {
        let doc = "Doc" + "\(i)"
        let Name = readableJSON["Documents"][doc]["name"].string as String!
        let Description = readableJSON["Documents"][doc]["description"].string as String!
        let Category = readableJSON["Documents"][doc]["category"].string as String!
        let Type = readableJSON["Documents"][doc]["type"].string as String!
        let Series = readableJSON["Documents"][doc]["tags"]["series"].string as String!
        let Group = readableJSON["Documents"][doc]["tags"]["group"].string as String!

        names.append(Name)
        descriptions.append(Description)
        categories.append(Category)
        types.append(Type)
        series.append(Series)
        groups.append(Group)

    }


}



func showTags(showTags: Bool) {

    tableView.reloadData()
}



func showTimestamp(showTimeStamp: Bool) {
    tableView.reloadData()
}


override func viewDidLoad() {
    super.viewDidLoad()

    parseJSON()



    //Sets button title to gear, sets button actions (to open menu)
    settings.title = NSString(string: "\u{2699}\u{0000FE0E}") as String!
    let font = UIFont.systemFontOfSize(25);
    settings.setTitleTextAttributes([NSFontAttributeName: font], forState:UIControlState.Normal)
    settings.target = self.revealViewController()
    settings.action = #selector(SWRevealViewController.rightRevealToggle(_:))

        }




override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return NumberofRows
}




override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("MainTableCell", forIndexPath: indexPath) as! MainTableViewCell


    if names.count != 0{
        cell.fileName.text = names[indexPath.row]
        cell.fileDescription.text = descriptions[indexPath.row]
        cell.fileCategory.text = categories[indexPath.row]
        cell.fileType.text = types[indexPath.row]

        cell.options.setTitle(NSString(string: ":") as String!, forState: .Normal)

        cell.tag1.text = series[indexPath.row]
        cell.tag2.text = groups[indexPath.row]

        if showTagsVal{
            cell.tag1.hidden = false
        }
        else{
            cell.tag1.hidden = true
        }
        if showTimeStampVal{
            cell.tag2.hidden = false
        }
        else{
            cell.tag2.hidden = true
        }



    }



    return cell
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.performSegueWithIdentifier("showView", sender: self)
}

// MARK: - Navigation

//In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if(segue.identifier == "showView"){
        let detailVC: DetailViewController = segue.destinationViewController as! DetailViewController
        let indexPath = self.MainTableView.indexPathForSelectedRow!
        detailVC.text = names[indexPath.row]

        self.MainTableView.deselectRowAtIndexPath(indexPath, animated: true)

    }

}

}

【问题讨论】:

  • 请出示您的MainTableViewController 代码。
  • @Fujia 刚刚添加了代码
  • 显示调用委托方法的代码
  • @dan 它在里面——方法 showTags 和 showTimeStamp 是包含重新加载数据调用的委托方法
  • 但是您实际调用这些方法的代码在哪里?

标签: ios swift xcode uitableview


【解决方案1】:

由于您的MainTableViewControllerUITableViewController 的子类,它已经链接了内置的表格视图。尝试删除MainTableView 插座(以及您在界面构建器中使用它所做的一切),并且每当您需要访问表格视图时,请使用从UITableViewController 继承的tableView 属性。

【讨论】:

  • 很高兴知道。然而,一旦我这样做了,我在控制台中得到了一个 Exc Bad Instruction 错误:致命错误:在展开 Optional 值时意外发现 nil。它发生在我为条形按钮项目设置标题的行上,如果我删除该行,它会移动到我定义其目标和操作的下一行。以前,这些行运行良好。有什么不同?
  • 您的settings 插座未连接到情节提要中的栏项目。
  • 我认为它是 - 栏按钮工作正常并打开菜单,直到我点击菜单内的开关然后它崩溃
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 2021-07-18
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 2014-12-29
相关资源
最近更新 更多