Ios 为什么nib文件(加载并添加到堆栈)中的UITableViewCell在ViewDidDisplay中为nil,但在viewDidLoad中为ok?
我的ViewController中有一个堆栈,我想加载一个nib文件(其中包含一个tableview)并将其添加到堆栈中。当我将它添加到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文件加载并添
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)内的数据,则应更新表视图内使用的数组并重新加载表。