2017-01-30 5 views
0

私のアプリでは、支払人の概要と各支払人の受取人リストを表示する要約ページがあります。つまり、要約ページの左側にリストが表示され、各リストをクリックすると詳細が右側に表示されます(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を使用してみました

  1. 、これを達成するために、次のことを試してみました。リストをクリックすると、オブザーバーが追加されました。このオブザーバは、UI要素を更新するdetailViewControllerのメソッドをトリガします。しかし、これは常にうまくいくわけではありません。私が要約ページに来たときに戻ると、要約ページに戻って同じことをすると、ViewDidDisapperでオブザーバを削除してもオブザーバが2回呼び出されます。また、いくつかのWebサイトでは、このような状況にNotificationCenterを使用しないでください。

  2. 第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) 
} 

誰も私がこの

答えて

0

プロトコル・ソリューションから抜け出すのを助けることができる最善の方法です。

protocol SummaryDetailProtocol { 
    func setSummaryDetails() 
} 

class SummaryListViewController: UIViewController 
{ 
    var summaryDetailsDelegate : SummaryDetailProtocol? 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    { 
     self.summaryDetailsDelegate?.setSummaryDetails()//use here 
    } 
} 

SummaryDetailViewControllerファイル:SummaryDetailViewControllerへ

class SummaryDetailViewController: UIViewController,SummaryDetailProtocol 
{ 
    internal func setSummaryDetails() { 
     //return whatever you want 
    } 


} 

そして最後に設定SummaryListViewControllerデリゲート:

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) 

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) 
listViewController.summaryDetailsDelegate = detailViewController // set delegate detail view controller 
あなたはこの

SummaryListViewControllerファイルと同様に使用することができます

関連する問題