私のアプリでは、支払人の概要と各支払人の受取人リストを表示する要約ページがあります。つまり、要約ページの左側にリストが表示され、各リストをクリックすると詳細が右側に表示されます(iPad)。 iPhone版も同じコードを再利用するために、別々のView Controllerとして持っています。つまり、私はベースViewController(SummaryViewController)を持っています。これで私はリストのViewController(SummaryListViewController)とViewControllerの詳細(SummaryDetailViewController)をサブビューしました。ベース・ビュー・コントローラSummaryViewControllerの負荷が、私はこの異なるView Controller間でUIプロパティに迅速にアクセス
//リストビューのようなリストと詳細ビューコントローラをサブビューとき今、私はリストの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を
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)
今、PROBは私がSummaryListViewControllののtableView-didSelectRowからSummaryDetailViewControllerでメソッドを呼び出す必要があり、あるディテールをサブビューするベースのViewControllerのビューでありますそれは私が送るデータに従ってUI要素を更新するでしょう。
私は通知センターにaddObserverを使用してみました
、これを達成するために、次のことを試してみました。リストをクリックすると、オブザーバーが追加されました。このオブザーバは、UI要素を更新するdetailViewControllerのメソッドをトリガします。しかし、これは常にうまくいくわけではありません。私が要約ページに来たときに戻ると、要約ページに戻って同じことをすると、ViewDidDisapperでオブザーバを削除してもオブザーバが2回呼び出されます。また、いくつかのWebサイトでは、このような状況にNotificationCenterを使用しないでください。
第2に、プロトコルを使用しようとしています。私は私がSummaryDetailViewControllerののviewDidLoadで今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
}
}
にプロトコルを記述し、私はそのよう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)
}
誰も私がこの