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
语句打开可选值并放置断点,找出实际错误的来源。