2016-07-01 2 views
0

У меня есть программно созданный rightBarButtonItem, который я хочу вызвать modal segue для контроллера навигации. Контроллер Nav является «контроллером корневого представления» на моей панели редактирования View View.Передача объекта через контроллер корневого представления

Здесь example of what I'm talking about, за исключением того, что кнопка создана в раскадровке и, таким образом, вы можете управлять переходом от кнопки в раскадровке. Это структура, я говорю о

HomeVC --(modal)--> Navigation Controller --(root view)--> EditVC 

Я не могу вставить в моей раскадровке в rightBarButtonItem, так что я должен создать программно и made the segue to the Navigation Controller following this answer.

Моей целью здесь является предоставление модального экрана для редактирования объекта, поэтому мне нужно передать этот объект из моего HomeVC в мой EditVC через контроллер навигации. Пример в первой ссылке состоял в том, чтобы создать объект, поэтому ничего не нужно было передать.

Вот, где я сейчас. Моя HomeVC (упрощая имена, чтобы его легче понять) имеет Navbar с программно созданный rightBarButtonItem которого селектор вызывает функцию:

func editButtonPressed() { 
    // doesn't call prepareForSegue unless I prepend super. 
    super.performSegueWithIdentifier("ShowEdit", sender: self)  
} 

Моя беда лежит внутри моей функции prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    print("this one prints") 
    if segue.identifier == "ShowEdit" { 
     print("this one prints") 
     // prints out the UINavigationController, not the EditVC 
     print("segue: \(segue.destinationViewController)") 
     if let editViewController = segue.destinationViewController as? EditViewController { 
      // THIS IS WHAT I WANT TO ACCOMPLISH 
      editViewController.selectedObject = selectedObject 
      print("DOES NOT PRINT") 
     } else { 
      print("this one prints") 
     } 
    } 

Так что, если вам может видеть, что я получаю, я хочу передать объект из HomeVC в EditVC, но мой segue в настоящее время переходит к контроллеру корневого представления навигации. Как передать его через контроллер навигации в EditVC?

Я думал о создании контроллера для контроллера Nav, так что было бы myNavVC.selectedObject == selectedObject, а затем в prepareForSegue myNavVC кодовый его с EditVC.selectedObject == selectedObject, но то, что я использовал бы для идентификатора, так как его вид корня?

+0

вы уверены, что destVC является editVC? – pacification

+0

Итак, сейчас destVC является навигационным контроллером, который является корневым представлением для редактированияVC, поэтому его не происходит внутри 'if allow editViewController ...'. См. Мой последний абзац, что я хочу делать, но не могу понять, как это сделать. –

ответ

3

Demo его в Objective-C:

UINavigationController *navigationController = (UINavigationController*)segue.destinationViewController; 

EditViewController *editViewController = (EditViewController *)[[navigationController viewControllers] firstObject]; 

editViewController.selectedObject = selectedObject; 

Demo в Swift:

if let navigationController = segue.destinationViewController as? UINavigationController { 
    if let editViewController = navigationController.viewControllers.first as? EditViewController { 
       editViewController.selectedObject = selectedObject 
    } 
} 
+0

Я просто начал программирование на iOS, использовал только Swift, поэтому я не знаю синтаксис Objective-C, поэтому я не уверен, что происходит во второй строке '[[navigationController viewControllers] firstObject]' –

+0

Я обновил код в Быстро! – Proton

+0

похоже, что он работает спасибо! @pacification Я реализовал его код как 'if allow navigationController = segue.destinationViewController как? UINavigationController { если разрешить editViewController = navigationController.viewControllers.first как? EditViewController { editViewController.selectedObject = selectedObject } } ', чтобы избавиться от принудительной разворачивания, хорошо выглядеть вам? –

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