Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios &引用;致命错误“;调用tableView.reloadData()时,tableView已正确连接_Ios_Swift_Uitableview_Swift3_Reloaddata - Fatal编程技术网

Ios &引用;致命错误“;调用tableView.reloadData()时,tableView已正确连接

Ios &引用;致命错误“;调用tableView.reloadData()时,tableView已正确连接,ios,swift,uitableview,swift3,reloaddata,Ios,Swift,Uitableview,Swift3,Reloaddata,我试图在程序运行时动态更新tableView。我相信我已经正确地更新了加载数据的数组,但是当我按下调用self.eventTable.reloadData()的按钮时,我收到了错误: fatal error: unexpectedly found nil while unwrapping an Optional value 以下是相关代码: 视图控制器: import UIKit class ViewController: UIViewController, UITableViewDataS

我试图在程序运行时动态更新
tableView
。我相信我已经正确地更新了加载数据的数组,但是当我按下调用
self.eventTable.reloadData()的按钮时,我收到了错误:

fatal error: unexpectedly found nil while unwrapping an Optional value
以下是相关代码:

视图控制器:

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

//Timer view
@IBOutlet weak var playButton: UIBarButtonItem!;
@IBOutlet weak var pauseButton: UIBarButtonItem!;
@IBOutlet weak var refreshButton: UIBarButtonItem!;
@IBOutlet weak var timerLabel: UILabel!

var counter = 0
var timer = Timer()
var isTimerRunning = false

//testing view container
var viewShowing = 1;

override func viewDidLoad() {

    // Do any additional setup after loading the view, typically from a nib.
    pauseButton.isEnabled = false

    hideAll();
    self.basicContainer.isUserInteractionEnabled = true;
    self.basicContainer.isHidden = false;

    self.timerLabel.text = String("00:00:00");

    eventTable.dataSource = self
    eventTable.delegate = self

    super.viewDidLoad()        
    loadEvents(event: "timer start")
}

ViewDidLoad()
中调用该函数时,该函数工作正常,但在另一个类中被按钮调用时,该函数工作不正常(“这是一个测试打印”打印到控制台,因此我知道按钮调用正在进行)

预期的行为是
tableView(eventTable)
重新加载,显示两个单元格,“计时器启动”和“测试单元格添加”(理想情况下,“测试单元格添加”位于顶部)

还想强调的是,eventTable与故事板相连,这似乎是这里的一个常见问题

以下是
Session.swift
文件和
eventTableViewCell.swift
文件(如果有帮助):

会话。swift

import Foundation
import UIKit

class Session {

//MARK: Properties

var session: String

//MARK: Initialization

init?(session: String) {

    guard !session.isEmpty else {
        return nil
    }

    self.session = session
}

}
import Foundation
import UIKit

class eventTableViewCell: UITableViewCell {
//MARK: Properties
@IBOutlet weak var eventLabel: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    // Configure the view for the selected state
}

}
eventTableViewCell.swift

import Foundation
import UIKit

class Session {

//MARK: Properties

var session: String

//MARK: Initialization

init?(session: String) {

    guard !session.isEmpty else {
        return nil
    }

    self.session = session
}

}
import Foundation
import UIKit

class eventTableViewCell: UITableViewCell {
//MARK: Properties
@IBOutlet weak var eventLabel: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    // Configure the view for the selected state
}

}
谢谢

编辑:调用testPrint()的ViewController


您似乎可以说,我正在实例化一个新的ViewController,这是导致问题的原因。我该如何着手解决这个问题?对Swift来说是相当新的

我认为,您的问题在于以下几行代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellReuseIdentifier") as! eventTableViewCell
    let event = eventData[indexPath.row]
    cell.eventLabel.text = event.session
    return cell
}
  • 您是否可以检查该单元格标识符是否与您的单元格标识符相同
  • eventData数组中的行数

您从其他类调用此函数的位置?切勿调用视图控制器生命周期事件,例如
视图将自己出现
。正如@3stud1ant3所问,您在哪里处理按钮点击以及如何调用此函数。很可能您正在实例化视图控制器的一个新实例,该实例未连接到情节提要场景,因此您的表视图是nilPost,您正在调用loadEvents函数以重新加载tableview的另一个类的代码。@Paulw11感谢您的建议,您似乎是对的。用其他类编辑文章。在主/父视图控制器中引用函数的最佳方式是什么?…并且正确设置了
eventLabel
outlet(引用非
nil
),我认为这不是问题所在。在viewDidLoad()中首次调用此函数时,此函数工作正常,只有在按下按钮第二次调用时才会出现问题。使用
if let
guard
语句打开可选值并放置断点,找出实际错误的来源。