Как устранить фатальную ошибку: индекс вне допустимого диапазона в Xcode Swift IOS - PullRequest
0 голосов
/ 02 августа 2020

Мне было интересно, почему этот код говорит, что индекс выходит за пределы диапазона

Specifi c код проблемы:

cell.textLabel?.text = contactsAry[indexPath.row]

Весь код имеет проблемы:

extension ContactsViewController: UITableViewDataSource, UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return (myContact.count + contactsAry.count)
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        
         if indexPath.row < myContact.count {
            let contact = myContact[indexPath.row]
            
            let cell = tableView.dequeueReusableCell(withIdentifier: "MainUsersAccount") as!
            ContactsLayout
            
            cell.setContacts(contacts: contact)
            
            return cell

        } else {

        let cell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "UserItem")
        cell.textLabel?.text = contactsAry[indexPath.row]

        return cell
        }
    }

Это мой массив «contactsAry» let contactsAry = ["Brandon", "Luisa"]

Код настройки MainUserAccount:

    func createArray() -> [Contacts] {
        var tempContact: [Contacts] = []
        
        let userName = "Temp User"
        
        let myContact = Contacts(UserIcon: UIImage(systemName: "\(userName.prefix(1).lowercased()).circle.fill")!, UserName: userName, MyAccountLabel: "My Account")
        
        tempContact.append(myContact)
        
        return tempContact
    }

У меня есть две разные ячейки прототипа, которые пытаются добавить в один и тот же tableView. Первая ячейка, которая в основном является ячейкой учетной записи пользователя, определяется как «MainUserAccount», и это всего лишь одна ячейка, в которой можно изменить значок и имя. Вторая ячейка обозначена как «UserItem» и представляет собой просто список пользователей, которых вы добавили в свой «список друзей». Я не уверен, почему я продолжаю получать эту ошибку. Приветствуется любая помощь.

Полный код ошибки, который я получаю в консоли:

Неустранимая ошибка: Индекс вне допустимого диапазона: файл /Library/Caches/com.apple.xbs/ Sources / swiftlang / swiftlang-1103.2.25.13 / swift / stdlib / public / core / ContiguousArrayBuffer.swift, строка 444 2020-08-02 03: 04: 18.896635-0700 Расписание [44839: 2131710] Неустранимая ошибка: индекс вне допустимого диапазона: файл /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.2.25.13/swift/stdlib/public/core/ContiguousArrayBuffer.swift, строка 444

Ответы [ 2 ]

0 голосов
/ 02 августа 2020

Что вы можете сделать, так это удалить счетчик драгоценного массива ... иначе он попытается получить доступ к 3-му экземпляру, а не к 0

let cell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "UserItem")
        cell.textLabel?.text = contactsAry[indexPath.row - myContact.count]
0 голосов
/ 02 августа 2020

Добро пожаловать в Stackoverflow! Ошибка:

Неустранимая ошибка: индекс вне диапазона: файл /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.2.25.13/swift/stdlib/public/core/ ContiguousArrayBuffer.swift, строка 444 2020-08-02 03:04: 18.896635-0700 Расписание [44839: 2131710] Неустранимая ошибка: индекс вне допустимого диапазона: файл /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang- 1103.2.25.13/swift/stdlib/public/core/ContiguousArrayBuffer.swift, строка 444

просто означает, что вы обращаетесь к индексу массива, но этот индекс больше максимального индекса массива.

Как вы уже знаете, доступ к массиву начинается с 0. Получение индекса из IndexPath осуществляется через row или item и section. Максимальный индекс массива можно получить через счетчик вашего массива данных минус 1.

Из того, что я вижу, как и то, что вы упомянули, у вас есть два разных типа клеток. То, как вы обрабатываете это в своем cellForRow, может быть правильным, но значение, которое вы передаете в numberOfRowsInSection, слишком велико, вы объединяете количество ваших обоих массивов.

return (myContact.count + contactsAry.count)

Сумма - 1 будет максимальной. indexPath.row ваш tableView будет пытаться получить доступ, следовательно, cra sh (вне диапазона).

Один из способов решить эту проблему - использовать раздел. Например, вы можете сделать это:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    
    if section == 0 {
        return myContact.count
    } else {
        return contactsAry.count
    }
}

, и для этого вам понадобится другой метод numberOfSections.

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

И оттуда обрабатывать разделы и строки таким же образом в вашем cellForRow. Вы можете взять его отсюда.

...