Swift 4.2 - Как вызвать «indexPath.row» из метода «didSelectRowAtIndexPath» в табличном представлении в другой класс? - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть два viewControllers.У одного есть tableView, у которого есть несколько ячеек из массива;А другой - это viewController, который содержит веб-набор, который я хочу представить в виде некоторых локальных HTML-файлов.Также я определил страницу webKit как следующую страницу tableView.Я хочу, чтобы, когда пользователь выбирает ячейку в табличном представлении, в соответствии с тем, какая ячейка выбрана, он переходит на страницу веб-набора, и некоторые части кодов выполняются для отображения пользователем определенного HTML-кода.Другими словами, у меня есть 5 HTML-файлов и 5 элементов в tableViewCells, поэтому, если пользователь выбирает, например, первый элемент, HTML1 показывает ему, если он выбирает вторую ячейку, HTML2 присутствует для него и т. Д.

Я перепробовал много способов.но ничего не случилосьтакже пытался создать экземпляр объекта из класса tableview ... пытался также некоторые другие проблемы здесь, в StackOverFlow, но не удалось

Первая страница:

var arr = ["masoud" , "hossein", "reza" , "shiva" , "fateme"]


 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("item selected is : \(indexPath.row)")
       // if indexPath.row == 1 {

            performSegue(withIdentifier: "TableSegue", sender: nil)

        //}

        tableView.deselectRow(at: indexPath, animated: true)
    }



    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        switch (segue.destination.view, segue.destination, sender) {

        case let (_, controller as WebKitController, indexPath as     NSIndexPath):
            controller.indexPath = indexPath
            break
        default:
            break
        }
    }

Вторая страница:

import WebKit

class WebKitController: UIViewController, WKUIDelegate, WKNavigationDelegate {

    @IBOutlet weak var myWebKit: WKWebView!

    var reza : String = String()

    var indexPath: NSIndexPath? {

        didSet {
            reza = (indexPath?.row.description)!
            print(indexPath?.row as Any)

            self.myWebKit.uiDelegate = self
            self.myWebKit.navigationDelegate = self

        }

    }


    override func viewDidLoad() {
        super.viewDidLoad()
    let url = Bundle.main.url(forResource: "reza", withExtension: "html", subdirectory: "ReZeynoo2")!
                        myWebKit.loadFileURL(url, allowingReadAccessTo: url)
                        let request = URLRequest(url: url)
                        myWebKit.load(request)


        self.myWebKit.uiDelegate = self
        self.myWebKit.navigationDelegate = self
        }

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

Я думаю, что вы можете передать ваше значение indexpath.row в отправителя вашего perfomSegue, и ваш контроллер второго вида просто использует это

, вот код

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "secondvc", sender: indexPath.row)
}

просто отправьте indexpath.row значение в отправителе

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "secondvc"{
        let vc = segue.destination as! SecondViewController
        vc.row = sender as! Int
    }
}
0 голосов
/ 25 декабря 2018

В качестве альтернативного подхода

Я бы сохранил не простой массив, а выделенную структуру имени и bool или нет

struct CellData {
   let name: String!
   let isSelected: Bool!
   let index: Int!

   init(name: String, isSelected: Bool, index: Int) {
       self.name = name
       self.isSelected = isSelected
       self.index = index
   }
}

Тогда в функции didSelectAtRow будет выделена ячейка, которая коснуласьи используйте эту информацию при подготовке к segue func

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.deselectAll()
    self.cellItems[indexPath.row].isSelected = true
    performSegue(withIdentifier: "TableSegue", sender: nil)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    switch (segue.destination.view, segue.destination, sender) {

    case let (_, controller as WebKitController, indexPath as     NSIndexPath):
        if let item = cellItems.first(where: {$0.isSelected == true}) {
            controller.indexPath = item.index
        }
        break
    default:
        break
    }
}

private func deselectAll() {
    for item in cellItems {
        item.isSelected = false
    }
}
0 голосов
/ 25 декабря 2018

Вам необходимо создать переменную Int в классе WebKitController как selectedRow, где выбранная строка будет назначена из выбора ячейки табличного представления,

// MARK: - Table view delegates
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.performSegue(withIdentifier: "TableSegue", sender: indexPath)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "TableSegue", let indexPath = sender as? IndexPath {
        let webController = segue.destination as? WebKitController
        webController.selectedRow = indexPath.row
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...