2015-08-13 5 views
1

Я пытаюсь получить контроллер View View для запуска нового контроллера View, но я не могу его получить, программно или с помощью раскадровки segues.Нажмите новый контроллер просмотра из пункта назначения Контроллер вида (быстрый)

Вот что я пытаюсь сделать:

У меня есть 3 Вид контроллеров (назовем их A, B и C). Все три были созданы (спроектированы?) В раскадровке. Я начинаю на контроллере просмотра A, и когда пользователь нажимает кнопку, я хочу представить контроллер представления B по модулю, а затем, когда пользователь выбирает ячейку в контроллере B просмотра, я хочу, чтобы контроллер просмотра B был отклонен (модально), и Я хочу, чтобы контроллер просмотра A нажал новый контроллер вида (контроллер C).

Способ, которым я пытался реализовать это до сих пор, - это когда пользователь нажимает кнопку в виде контроллера A, я программно модно нажимаю контроллер просмотра B, а затем, когда пользователь выбирает ячейку в виде контроллера B, я перехожу назад для просмотра контроллера, и попытаться подтолкнуть вид контроллера C из функции prepareForSegue View Controller Б так:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let viewA = segue.destinationViewController as? ViewControllerA { 
     let cell = sender as! ViewControllerBTableViewCell 

     var viewC = storyboard?.instantiateViewControllerWithIdentifier("viewControllerC") as! ViewControllerC 
     viewC.IDToDisplay = cell.userID 
     viewA.navigationController?.pushViewController(viewC, animated: true) 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

Однако, когда я запускаю этот ... вид контроллер C никогда не толкнул!

Причина, по которой мне нужно нажать контроллер просмотра C из контроллера A, заключается в том, что мне нужно, чтобы пользователь мог вернуться назад, чтобы просмотреть контроллер A из контроллера просмотра C, используя кнопку «назад» ... не вернуться к просмотру контроллер B из контроллера вида C.

По существу поток, который я пытаюсь создать, представляет собой вид A -> вид B в виде мода -> вид C ---> назад, чтобы просмотреть A, как если бы вид B исчез (потому что он должен). Обратите внимание, однако, что вид B действительно нужно, чтобы иметь возможность установить значение вида C IDToDisplay перед тем вид выталкивает для просмотра C.

Есть чистый (стандартный) способ осуществить это? Или мне придется разворачиваться?

ответ

1

Вы можете решить эту проблему двумя способами

первый вариант: вы можете создать один Clousure вар в контроллере B и выполнить его, прежде чем dissmiss контроллер

B, например: в BController

class BTableViewController: UITableViewController { 
    var pushClosure:(()->())? 


    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     pushClosure?() 
     self.navigationController?.dismissViewControllerAnimated(true, completion: nil)  
    } 

} 

И в контроллере в prepareForSegue сделать что-то подобное

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "SegueID" { 

     let nextView:BController = segue.destinationViewController as! BController 
     nextView.pushClosure = { 
      self.performSegueWithIdentifier("SegueID To C Controller", sender:nil) 
     } 
    } 
    } 

Второй вариант заключается в реализации собственного делегата в BController

protocol ClassNameDelegate{ 

func pushToC() 

} 

class ClassName: NSObject { 

    var delegate:ClassNameDelegate? 



    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     self.delegate.pushToC() 
     self.navigationController?.dismissViewControllerAnimated(true, completion: nil)  
    } 
} 

И в контроллере

class AViewController:ClassNameDelegate{ 

    func pushToC(){ 
    self.performSegueWithIdentifier("SegueID To C Controller", sender:nil) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "SegueID" { 
      let bController:BController = segue.destinationController as! BController 
      bController.setDelegate = self 
     } 
    } 
} 

Надеюсь, это вам поможет.

+0

Спасибо, ответ! Опция делегата выглядит как стандартный подход ... единственная проблема заключается в том, что когда я ее реализовал, когда я вызываю функцию делегата от контроллера B, диспетчер просмотра B отбрасывается, но ничего не происходит. Когда я пишу оператор print в функции делегата в контроллере A, он никогда не печатается. Есть ли причина, по которой функция делегата не срабатывает при вызове в контроллере B? – SwiftHacker

+0

Понял, что функция не стреляла в контроллер управления A, потому что диспетчер представлений A никогда не был установлен в качестве делегата для контроллера вида B (oops, не знал, что я должен был это сделать). Установка контроллера представления A в качестве делегата для контроллера B просмотра, когда я создаю контроллер B представления и представляю, что он исправил проблему. – SwiftHacker

+0

Я рад, что он решил вашу проблему, если она решит проблему, вы можете проверить ответ. – Klinkert0728

0

Является ли пользователь нажатием кнопки в viewController C? Если да, то вы можете использовать это:

self.navigationController?.popToRootViewControllerAnimated(true) 

просто добавьте его туда, где вы нажимаете на кнопку в ViewController C, и он должен вернуться к

+0

Спасибо, но это не касается моего вопроса: неважно, что делает пользователь в viewController C, я хочу, чтобы они могли вернуться к просмотру. Естественно, нажав кнопку «назад» на Панель навигации. – SwiftHacker

Смежные вопросы