Как я могу включить URL-адреса в структуру таблицы (массив) и вызвать их в didSelectRowAt?

Я работаю в xCode 10.2 с быстрым. Я создал глобальные переменные в моем первом контроллере представления для 6 представлений таблиц. В раскадровке у меня 6 tableViewControllers. В отдельном быстром файле я создал структуру таблицы для хранения массива и отображения данных в каждой соответствующей ячейке. В каждом контроллере представления в didSelectRowAt подключается следующее табличное представление. Моя проблема в том, когда я дохожу до последнего представления таблицы. Мне нужно связать URL-адреса веб-сайтов с массивом в пятой таблице. Я все время получаю сообщение об ошибке: не могу преобразовать строку в URL. Пожалуйста помоги!

 var fifthArray = [
    FifthTableStruct(FifthTitle: ["Energy Guide", "https://www.google.com", "Warranty Page", "Use & Care Guide", "Specification Sheet", "FIT System", "Installation Instructions"]),
    FifthTableStruct(FifthTitle: ["Energy Guide", "Warranty Page", "Use & Care Guide", "Specification Sheet", "FIT System", "Installation Instructions"])
    ]

var sixthArray = [
    SixthTableStruct(SixthTitle:  ["https://www.whirlpool.com/content/dam/global/documents/201708/EnergyGuide-W11037203-RevA.pdf", "https://www.whirlpool.com/content/dam/global/documents/201708/WarrantyPage-W11037201-W.pdf", "https://www.whirlpool.com/content/dam/global/documents/201708/UseandCareGuide-W11037201-RevA.pdf", "https://www.whirlpool.com/content/dam/global/documents/201711/WL170160A_p2.pdf", "https://www.whirlpool.com/content/dam/global/documents/201901/wash-performance-guarantee-en.pdf", "https://www.whirlpool.com/content/dam/global/documents/201711/InstallationInstructions-W10682737-RevA.pdf"])
    ]

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let urlString = self.sixthArray[indexPath.row]
    if let url = URL(fileURLWithPath: urlString)
    {
        UIApplication.shared.openURL(url)
    }

}

У меня есть код для tableStruct в файле массива отдельно от viewController.

    import Foundation
    import UIKit


    struct SecondTableStruct {
        var SecondTitle = [String]()
    }
    struct ThirdTableStruct {
        var ThirdTitle = [String]()
    }
   struct FourthTableStruct {
        var FourthTitle = [String]()
    }
    struct FifthTableStruct {
        var FifthTitle = [String]()
    }
    struct SixthTableStruct {
        var SixthTitle = [String]()
    }

person Community    schedule 17.04.2019    source источник
comment
URL-адрес Google в пятом массиве был тестовым. не должно быть там.   -  person    schedule 18.04.2019
comment
Используйте URL(string: urlString), чтобы преобразовать строку в URL-адрес.   -  person Rudedog    schedule 18.04.2019
comment
Я пробовал, все еще говорит, что URL-адрес не может быть преобразован в строку ...   -  person    schedule 18.04.2019
comment
Вот ссылка на снимок экрана с моим кодом и ошибкой, когда я меняю ее на ваше предложение. drive.google.com/file/d/1FCusnpnzmRRDr702Vjs/d/d/1FCusnpnzmRRDr702Vjsvjdjdjdjdjdjdjdjddr   -  person    schedule 18.04.2019
comment
Снимки экрана не очень полезны, но элементы SixthArray относятся к типу SixthTableStruct, а не String. Ошибка на вашем скриншоте ясно говорит об этом. На вашем скриншоте определенно не сказано, что «URL-адрес не может быть преобразован в строку». Точный текст ошибок важен, когда вы задаете вопросы. Это означает использование копирования и вставки, чтобы получить их и разместить здесь.   -  person Rudedog    schedule 18.04.2019
comment
Спасибо за совет. Я пробовал несколько разных способов, один из которых дал мне исходную ошибку, о которой я упоминал. Когда я изменил его на ваше предложение, не удалось преобразовать значение типа SixthTableStruct в ожидаемый тип аргумента String. Если у вас есть полезные предложения, я был бы признателен.   -  person    schedule 18.04.2019
comment
Покажите свой код для SixthTableStruct и FifthTableStruct.   -  person Tomas Jablonskis    schedule 18.04.2019
comment
Я обновил свой пост кодом. Спасибо за помощь.   -  person    schedule 18.04.2019


Ответы (2)


sixthArray - это массив SixthTableStruct, SixthTableStruct имеет одно поле SixthTitle, тип которого является массивом String.

Итак, чтобы получить одну строку, хранящуюся в sixthArray, вам необходимо:

  1. Индексируйте в sixthArray, чтобы получить одно значение типа SixthTable, назовем это intermediate1
  2. Выберите поле SixthTitle intermediate1. Чтобы получить значение типа массива String, назовем это intermediate2
  3. Индексируйте intermediate2, чтобы получить одно значение String

В коде:

let intermediate1 = sixthArray[someIndex]
let intermediate2 = intermediate1.SixthTitle
let urlString = intermediate2[someOtherIndex]

Мы не можем сказать вам, какие два значения индекса вам нужны, предположительно, одно из них indexPath.row. (Вы, конечно, можете записать эти три строки как одну без промежуточных элементов, если хотите.)

Несколько предложений: сначала у вас есть заголовки страниц и связанные URL-адреса, которые образуют тесно связанную пару значений данных, разбитых и сохраненных в отдельных массивах, требующих от вас тщательного управления порядком элементов в этих массивах и потери тесной связи между предметами. Рассмотрим единый массив некоторых struct, скажем PageDetails, с соответствующими свойствами, скажем, title и URL, чтобы они оставались вместе.

Во-вторых, массивы могут содержать URL, а не только String ...

HTH

person CRD    schedule 19.04.2019

В вашем didSelectRowAt выполните следующие действия. В настоящее время вы напрямую обращаетесь к структуре, но не к ее массиву с именем SixthTitle

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

let urlString = self.sixthArray.SixthTitle[indexPath.row]
if let url = URL(fileURLWithPath: urlString)
{
    UIApplication.shared.openURL(url)
}

}

person Abu Ul Hassan    schedule 19.04.2019