2016-01-02 5 views
1

У меня возникли некоторые проблемы играя с два viewcontrollers, которые взаимодействуют простой способ:Представления View Controller теряют подвиды при отклонении представило VC

homeViewController показывает список дел, с кнопкой AddTask. Кнопка addTask запускает дополнительный viewController, который действует как «форма» для заполнения пользователем.

Однако при вызове

self.dismissViewControllerAnimated(true, completion: nil); 

внутри представленного контроллера представления я возвращаюсь к моей домашней странице, но это пустое белое и, кажется, ничего не видно, кроме зрения высшего уровня по раскадровке может (т.е. тот, который покрывает весь экран).

Все мои взгляды, сцены и т. Д. Были созданы с автозапуском в раскадровке. Я посмотрел вокруг на переполнение стека, которые приводят ко мне играть с авто-изменения размера параметра подвид т.е .:

self.view.autoresizesSubviews = false; 

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

Заранее спасибо

редактировать:

Представляю ВК следующим образом:

func initAddNewTaskController(){ 
    let addNewTaskVC = self.storyboard?.instantiateViewControllerWithIdentifier("AddNewTaskViewController") as! AddNewTaskViewController; 
    self.presentViewController(addNewTaskVC, animated: true, completion: nil); 
} 

edit2:

Хотя я признаю, что с помощью делегатов или разматывания SEGUE действительно может обойти проблема, с которой я сталкиваюсь (по предложению campbell_souped), я до сих пор не понимаю, что происходит в основном, когда я отклоняю свой контроллер представления, который вызывает пустой экран.

Я понимаю, что вызов sentViewControllerAnimated передается на контроллер представления представления (в данном случае мой homeViewController). Поскольку мне не нужно делать какие-либо предварительные или пост-увольняющие конфигурации, использование делегата (на мой взгляд) здесь не нужно.

Моя текущая мысль, что по какой-то причине, когда я взываю

dismissViewControllerAnimated(true, completion:nil); 

в моем addNewTaskViewController, это на самом деле отпуская мою homeViewController. Я надеюсь, что кто-то может просветить меня относительно того, что именно я не понимаю, как представления/отклонения диспетчеров представлений.

+0

Можете ли вы показать, как вы представляете контроллер как «форму»? –

+0

отредактировал оригинальный пост; Пользовательский интерфейс, построенный с автозагрузкой; не используя диаграмму делегирования – user3605508

ответ

5

В такой ситуации я обычно беру один из двух маршрутов. Либо настройте делегата на AddNewTaskViewController, либо используйте разматывать сеанс.

С делегатом подхода, создать протокол:

protocol AddNewTaskViewControllerDelegate { 
    func didDismissNewTaskViewControllerWithSuccess(success: Bool) 
} 

Добавить дополнительное свойство, которое представляет делегат в вашем AddNewTaskViewController

var delegate: AddNewTaskViewControllerDelegate? 

Затем вызовите didDismissNewTaskViewControllerWithSuccess всякий раз, когда вы собираетесь увольнение AddNewTaskViewController:

Если запись была добавлена ​​s uccessfully:

self.delegate?.didDismissNewTaskViewControllerWithSuccess(true) 
self.dismissViewControllerAnimated(true, completion: nil); 

Или если была отмена/отказ:

self.delegate?.didDismissNewTaskViewControllerWithSuccess(false) 
self.dismissViewControllerAnimated(true, completion: nil); 

Наконец, установить себя в качестве делегата, изменив свой предыдущий фрагмент кода:

func initAddNewTaskController(){ 
    let addNewTaskVC = self.storyboard?.instantiateViewControllerWithIdentifier("AddNewTaskViewController") as! AddNewTaskViewController; 
    self.presentViewController(addNewTaskVC, animated: true, completion: nil); 
} 

к этому:

func initAddNewTaskController() { 
     guard let addNewTaskVC = self.storyboard?.instantiateViewControllerWithIdentifier("AddNewTaskViewController") as AddNewTaskViewController else { return } 
     addNewTaskVC.delegate = self 
     self.presentViewController(addNewTaskVC, animated: true, completion: nil); 
    } 

    ... 
} 

// MARK: AddNewTaskViewControllerDelegate 
extension homeViewController: AddNewTaskViewControllerDelegate { 

    func didDismissNewTaskViewControllerWithSuccess(success: Bool) { 
     if success { 
      self.tableView.reloadData() 
     } 
    } 

} 

[Если расширение находится за пределами вашего homeViewController класса]

С размотки SEGUE подход, посмотрите на этот пример Ray Wenderlich: http://www.raywenderlich.com/113394/storyboards-tutorial-in-ios-9-part-2

Этот подход включает в себя Ctrl-перетаскивание от Вашего IBAction к выходу объекта над контроллером представления и затем выбрать правильное имя действия из всплывающего меню

+0

спасибо за ответ! другой вопрос, который у меня есть, в чем принципиальное отличие использования делегата от этого или его отсутствия? – user3605508

+1

Проще говоря, шаблон делегата является более надежным. Вы можете добавить дополнительные функции или даже добавить дополнительные параметры в функцию 'didDismissNewTaskViewControllerWithSuccess'. –

+0

Знаете ли вы, что может быть причиной моей проблемы, просто отклонив контроллер вида? – user3605508

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