Можно ли вызвать указатель пути viewSelect таблицы контроллера другого представления и выполнить его? - PullRequest
0 голосов
/ 09 июля 2019

Прежде всего

У меня есть ViewController, у него есть кнопка

Эта кнопка вернется к определенному ViewController через навигацию

var viewControllers = self.navigationController!.viewControllers

while !(viewControllers.last is MainViewController) {  
             viewControllers.removeLast()
          }

let destinationViewController = self.storyboard?.instantiateViewController(withIdentifier: "destinationViewController") as! destinationViewController

viewControllers.append(destinationViewController)

self.navigationController?.setViewControllers(viewControllers, animated: false)

В моем destinationViewController есть TableView

Мне нужно автоматически провести Первый ряд

Поэтому я записываю этот код перед setViewControllers выше

Но получим nil

let indexPath = IndexPath(row: 0, section: 0)
destinationViewController.tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none)  

Вот destinationViewController

class DestinationViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
      }
}
    extension DestinationViewController:UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
        //Here is user select can be triggered, but I want to call from another viewController
       }
    }

Мой вопрос: как мне вызвать строку tableView, которую я хочу, из другого viewController?

Ответы [ 3 ]

0 голосов
/ 09 июля 2019

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

Проблема с кодом:

Ваш делегат tableView и источник данных установлены в представлении контроллера целевого представления, загруженного

override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
      }
}

Но вы пытаетесь вызвать selectRow даже до того, как делегат и источник данных установлены (я имею в виду, когда вы звоните selectRow, ваш viewDidLoad даже не вызывается)

let indexPath = IndexPath(row: 0, section: 0)
destinationViewController.tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none)

потому что вы четко заявили

Поэтому я записываю этот код перед setViewControllers выше

Решение:

убедитесь, что вы установили делегат и источник данных для tableView даже перед вызовом selectRow(at:

Два возможных решения

1. Убедитесь, что viewDidLoad вызывается даже до того, как вы позвоните selectRow

Чтобы вызвать viewDidLoad, вы можете попробовать

let destinationViewController = self.storyboard?.instantiateViewController(withIdentifier: "destinationViewController") as! destinationViewController
let _ = destinationViewController.view

или, если вы предпочитаете более безобразный заход на посадку, viewDidLoad вручную: P

destinationViewController.viewDidLoad()

2. Задайте источник данных делегата и источник данных вручную перед вызовом selectRow

let destinationViewController = self.storyboard?.instantiateViewController(withIdentifier: "destinationViewController") as! destinationViewController
destinationViewController.tableView.delegate = destinationViewController
destinationViewController.tableView.dataSource = destinationViewController

Совет: Используйте корпус Паскаля для имен классов DestinationViewController

0 голосов
/ 09 июля 2019

просто сделайте одно, в вашем предназначении viewController обновит ваш tableView после viewDidAppear.

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    self.tableView.selectRow(at: IndexPath(row: 0, section: 0), animated: true, scrollPosition: .top)
}
0 голосов
/ 09 июля 2019

Вместо destinationViewController.tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none), почему бы не позвонить:

destinationViewController.
    tableView(destinationViewController.tableView, 
    didSelectRowAt: IndexPath(row: 0, section: 0))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...