Ios 为什么nib文件(加载并添加到堆栈)中的UITableViewCell在ViewDidDisplay中为nil,但在viewDidLoad中为ok?

Ios 为什么nib文件(加载并添加到堆栈)中的UITableViewCell在ViewDidDisplay中为nil,但在viewDidLoad中为ok?,ios,uitableview,swift3,ios8,Ios,Uitableview,Swift3,Ios8,我的ViewController中有一个堆栈,我想加载一个nib文件(其中包含一个tableview)并将其添加到堆栈中。当我将它添加到viewdiload中时,没有问题,但当我将它放入viewdileaseapp crash中时,出现以下错误: fatal error: unexpectedly found nil while unwrapping an Optional value 有一些UITableViewCell,我根据行在cellForRowAt函数中返回它们。当nib文件加载并添

我的ViewController中有一个堆栈,我想加载一个nib文件(其中包含一个tableview)并将其添加到堆栈中。当我将它添加到
viewdiload
中时,没有问题,但当我将它放入
viewdilease
app crash中时,出现以下错误:

fatal error: unexpectedly found nil while unwrapping an Optional value
有一些
UITableViewCell
,我根据行在
cellForRowAt
函数中返回它们。当nib文件加载并添加到
viewdide
中时,它们似乎为零

这是我的密码:

class MyOrdersViewController: UIViewController {

@IBOutlet weak var stack: UIStackView!
override func viewDidLoad() {
    super.viewDidLoad()
    //setCards()
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    setCards()
}


func setCards(){
        let orderCard = NibLoader.loadViewFromNib(name: "MyOrdersView", selfInstance: self, nibType: MyOrdersView.self) as! MyOrdersView   
        stack.addArrangedSubview(orderCard)
}
}


class MyOrdersView: UIView,UITableViewDelegate,UITableViewDataSource {

@IBOutlet weak var tableView: UITableView!

@IBOutlet weak var seprator: UITableViewCell!

@IBOutlet weak var date: UILabel!
@IBOutlet weak var firstCell: UITableViewCell!
@IBOutlet weak var code: UILabel!

@IBOutlet weak var secondCell: UITableViewCell!
@IBOutlet weak var price: UILabel!

@IBOutlet weak var thirdCell: UITableViewCell!
@IBOutlet weak var orderStep: UILabel!

@IBOutlet weak var payModel: UILabel!
@IBOutlet weak var cancelBtn: UIButton!
@IBOutlet weak var fourthCell: UITableViewCell!

override func awakeFromNib() {
    tableView.delegate = self
    tableView.dataSource = self
    UIFunctions.setBordersStyle(view: cancelBtn, radius: 5, width: 1, color: UIColor.red)
}

func setValue(order:Order){
    self.date.text = order.order_date
    self.code.text = String(describing: order.order_code ?? 0)
}

// MARK: - Table view data source

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 5
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    var cell=UITableViewCell()

    switch indexPath.row {
    case 0:
        cell = seprator
    case 1:
        cell = firstCell
        cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
    case 2:
        cell = secondCell
        cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
    case 3:
        cell = thirdCell
        cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
    case 4:
        cell = fourthCell
    default:
        break
    }

    return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    var height = 0
    switch indexPath.row {
    case 0:
        height = 25
    case 4:
        height = 70
    default:
        height = 50
    }

    return CGFloat(height)
}
}
原因似乎是因为
viewDidLoad
是第一个要使用的方法 在视图生命周期中调用,在其中添加
nib
引用以确保 在绘制视图(表格)时,这些视图可供 位于
cellForRow

但是如果将相同的代码放入
viewdide
,则视图已显示 此时已加载,并且尚未引用表视图 引用自
Nib
。因此出现了零误差


详细讨论了各种视图生命周期方法及其调用顺序。

您将
firstCell
secondCell
分配到哪里?我在nib文件中创建了它们(从对象库中拖动tableview单元格),那么如何在运行时将视图(包含tableview)添加到堆栈中?是的,我向服务器发送请求,它会返回一个项目列表(和数组数组)。我不知道在哪里进行服务器调用,但如果您只是想在收到服务器的响应后更新表视图,它应该可以工作。。您只需更新数组,该数组最初包含0个元素并显示空表,之后将显示来自服务器的数据响应。。只需将NibLoader.loadViewFromNib保留在viewDidLoad中,其余部分应该得到处理。这只是我放在那里的一个示例代码。我只是想表明,除了在viewDidLoad中,我不能在任何地方调用setCards函数,我不知道应该调用setCards多少次。它决定在服务器响应后(在viewDidLoad中调用请求,但在收到响应后,我不能调用setCards函数),理想情况下应该只调用一次,因为它只是为您设置了视图。如果要更新该视图(在本例中为tableview)内的数据,则应更新表视图内使用的数组并重新加载表。