2017-01-30 9 views
0

В моем приложении у меня есть сводная страница, на которой будет отображаться сводка плательщиков и список получателей каждого плательщика. То есть, итоговая страница будет иметь список в левой части, и щелчок по каждому списку покажет его детали с правой стороны (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, который обновит элементы пользовательского интерфейса в соответствии с данными, которые я отправляю.

Я попытался следующие вещи, чтобы достичь этого,

  1. Я попытался с помощью addObserver в NotificationCenter. Когда я нажимаю на список, я добавил наблюдателя. И этот наблюдатель запускает метод в detailViewController, который будет обновлять элементы пользовательского интерфейса. Но это не работает все время. Когда я перейду на страницу «Сводка», вернитесь назад, и если я снова приду к сводной странице и сделаю то же самое, наблюдатель вызывается дважды даже после удаления наблюдателя в ViewDidDisapper. А также я узнал на нескольких сайтах, что NotificationCenter не следует использовать для такого рода ситуаций.

  2. Во-вторых, я пытаюсь использовать протоколы. Я думал, что я хотел бы написать протокол в 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) 
} 

Может кто-нибудь помочь мне выйти из этого решения протокола

ответ

0

является лучшим. Вы можете использовать как этот

SummaryListViewController файла:

protocol SummaryDetailProtocol { 
    func setSummaryDetails() 
} 

class SummaryListViewController: UIViewController 
{ 
    var summaryDetailsDelegate : SummaryDetailProtocol? 

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

SummaryDetailViewController файла:

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


} 

И, наконец, набор SummaryListViewController делегат SummaryDetailViewController:

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