iOS奇数线程1:致命错误:iPad上的索引超出范围

iOS奇数线程1:致命错误:iPad上的索引超出范围,ios,swift,uitableview,Ios,Swift,Uitableview,得到 线程1:致命错误:索引超出范围 在iPad上运行应用程序时出错-它可以在iPhone上运行 在Master Detail应用程序的UITableView中,我得到了返回数组计数的numberOfRowsInSection,显然在调用之前它没有被初始化。以下是相关代码: var myObjects = [[MyObject]]() var first = [MyObject]() var second = [MyObject]() let sectionTitles = ["First"

得到

线程1:致命错误:索引超出范围

在iPad上运行应用程序时出错-它可以在iPhone上运行

在Master Detail应用程序的UITableView中,我得到了返回数组计数的numberOfRowsInSection,显然在调用之前它没有被初始化。以下是相关代码:

var myObjects = [[MyObject]]()
var first =  [MyObject]()
var second = [MyObject]()

let sectionTitles = ["First", "Second"]

override func viewWillAppear(_ animated: Bool) {
    ...
    loadMyObjects()
    ...
}


private func loadAmenities() {

    myObjects.removeAll()
    guard let myObject1 = new MyObject(name: "One", property2: "initialized_property") else {
    fatalError("Failed to initialize myObject1")
    }

    ...

    first += [myObject1, myObject2, myObject3, myObject4]
    second += [myObject5, myObject6, myObject7]
    myObjects = [first, second]
}

override func numberOfSections(in tableView: UITableView) -> Int {
    return sectionTitles.count
}

override func tableView(_ tableView:UITableView, numberOfRowsInSection section: Int)-> Int {
    return myObjects[section].count // error happens here
}
在表尝试加载之前,我应该在哪里实例化数据?这很奇怪,因为是tableView导致了问题,但tableView在iPhone中正确加载。谢谢你的帮助

编辑:

在iPhone上,似乎在tableview的numberOfRowsInSection之前调用ViewWillAspect方法,但在iPad上,调用顺序正好相反。事实上,viewDidLoad和tableView方法是在ViewWill出现之前调用的

numberOfSections需要返回myObjects.count。tableview在将数据加载到MyObject数组之前请求数据,但是当VC实例化时,sectionTitles会初始化

override func numberOfSections(in tableView: UITableView) -> Int {
    return myObjects.count
}
添加数据后,还需要重新加载表

崩溃只发生在iPad上的原因是由于iPad上主-细节控制器的不同行为

iPad中没有调用viewWillLoad方法,而且由于数据数组的初始化都是本地数据,不需要异步加载,因此最简单的解决方法是测试数组并在viewDidLoad中调用加载函数:


请复制并粘贴真实代码。是否有任何异步处理正在进行?没有异步处理,代码是相同的,无论是抽象的还是非抽象的。您的guard语句中的某些内容可能会导致问题,因为没有正确初始化所有对象,但如果没有实际的代码,则无法确定。正如@rmaddy所说,发布的是实际代码,而不是精简版本。如果这是一个保护问题,那么该行将出现故障,并且所有对象都正确加载到iPhone中。您可以在崩溃的行上设置一个断点,然后观察调用堆栈,看看谁在调用reloadData?如果没有更多的代码,就说不出更多的东西了。感谢您的关注——在iPad上加载视图之前,肯定会出现初始化失败的情况。myObjects变量是一个myObjects数组-因此我实际上需要count myObject[section].count-这在iPad上很好。整个垃圾开始是因为我试图用标题组织表,myObjects.count是我在需要将其转换为多维数组之前拥有的。您应该始终以numberOfSections返回节数据数组的计数。返回节头计数是错误的。我没有返回节头计数。我返回MyObject数组中数组的计数-第一个或第二个。哪一个基于方法的节参数。否,但在numberOfSections中,您将返回节标题的计数。您应该始终返回节数据源的计数,在本例中是MyObject
override func viewDidLoad() {
    super.viewDidLoad()
    ...
    if winter.count < 1 {
        loadAmenities()
    }
}