В моем приложении у меня есть сводная страница, на которой будет отображаться сводка плательщиков и список получателей каждого плательщика. То есть, итоговая страница будет иметь список в левой части, и щелчок по каждому списку покажет его детали с правой стороны (iPad). Чтобы повторно использовать тот же код для версии iPhone, у меня есть его как отдельные контроллеры представлений. То есть у меня есть базовый ViewController (SummaryViewController). В этом я просматриваю ViewController списка (SummaryListViewController) и ViewController деталей (SummaryDetailViewController). Теперь, когда SummaryViewController загружает базовый контроллер точки зрения, я подвид списка и подробно контроллеры просмотра, как этотДоступ к свойствам пользовательского интерфейса для разных контроллеров просмотра в swift
// ListView представляет собой вид в базовой ViewController, к которому я подвид в списке ViewController
let listViewController = SummaryListViewController(nibName:"SummaryListViewController", bundle: nil)
addChildViewController(listViewController)
listViewController.view.frame = CGRect(x: 0, y: 0, width: self.ListView.frame.size.width, height: self.ListView.frame.size.height)
ListView.addSubview(listViewController.view)
listViewController.didMove(toParentViewController: self)
// DetailView представляет собой вид в базовой ViewController, к которому я подвиду в Подробности ViewController
let detailViewController = SummaryDetailViewController(nibName: (UIDevice.current.userInterfaceIdiom == .pad ? "SummaryDetailViewController" : "SummaryDetailViewController_iPhone"), bundle: nil)
addChildViewController(detailViewController)
DetailView.frame = CGRect(x: DetailView.frame.origin.x, y: DetailView.frame.origin.y, width: self.DetailView.frame.size.width, height: self.DetailView.frame.size.height)
DetailView.addSubview(detailViewController.view)
detailViewController.didMove(toParentViewController: self)
Теперь ВЕРЫ это, я должен вызвать метод в SummaryDetailViewController от Tableview-didSelectRow из SummaryListViewControll er, который обновит элементы пользовательского интерфейса в соответствии с данными, которые я отправляю.
Я попытался следующие вещи, чтобы достичь этого,
Я попытался с помощью addObserver в NotificationCenter. Когда я нажимаю на список, я добавил наблюдателя. И этот наблюдатель запускает метод в detailViewController, который будет обновлять элементы пользовательского интерфейса. Но это не работает все время. Когда я перейду на страницу «Сводка», вернитесь назад, и если я снова приду к сводной странице и сделаю то же самое, наблюдатель вызывается дважды даже после удаления наблюдателя в ViewDidDisapper. А также я узнал на нескольких сайтах, что NotificationCenter не следует использовать для такого рода ситуаций.
Во-вторых, я пытаюсь использовать протоколы. Я думал, что я хотел бы написать протокол в SummaryListViewController
protocol SummaryDetailProtocol { func setSummaryDetails() }
class SummaryListViewController: UIViewController
{
var summaryDetailsDelegate : SummaryDetailProtocol?
func delegateFromSummaryDetails(delegate: SummaryDetailProtocol)
{
self.summaryDetailsDelegate = delegate
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
self.summaryDetailsDelegate?.setSummaryDetails()
}
func delegateFromSummaryDetails(delegate: SummaryDetailProtocol)
{
self.summaryDetailsDelegate = delegate
}
}
Сейчас в ViewDidLoad в SummaryDetailViewController, я хотел бы послать ссылку делегата на listViewController, так что listViewController может вызвать метод setSummaryDetails.
override func viewDidLoad()
{
super.viewDidLoad()
sendDelegateReferenceToListPage()
}
func sendDelegateReferenceToListPage()
{
let summaryListObj = SummaryListView()
//This is where the error occurs. It throws the error since i try to cast SummaryDetailViewController to parameter of type SummaryDetailProtocol of SummaryListViewController
summaryListObj.delegateFromSummaryDetails(delegate: self as! SummaryDetailProtocol)
}
Может кто-нибудь помочь мне выйти из этого решения протокола