2014-12-22 9 views
4

Я создал segue в своем раскадровке. Это модальный переход, и я дал ему идентификатор LoginSegue.Xamarin iOS Unwind Segue или DismissViewController программно и передавать данные

В мой контроллер, я делаю:

PerformSegue("LoginSegue", this); 

Все хорошо. Новый контроллер работает так, как ожидалось.

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

Или я могу позвонить (с кодом):

DismissViewController(true, null); 

Дело в том, что я хочу передать некоторые данные.

ParentViewController - null.

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

[Action("UnwindToCaller:")] 
    public void UnwindToCaller(UIStoryboardSegue seque) 
    { 
     var loginViewController = (LoginViewController)seque.SourceViewController; 
     var data = loginViewController.getData(); 
     Console.WriteLine("Unwind to Caller Here."); 
    } 

Я также не могу найти способ дать раскрутку segue раскадровку Id.

Если бы я мог выполнить размотку segue из кода, все было бы хорошо, или если бы я мог передать некоторые данные обратно с DismissViewController, это тоже было бы хорошо.

Опять же, это похоже на довольно распространенную вещь.

+0

Если вы нажмете на сегмент в списке сюжетов в левой части окна, вы можете использовать инспектор атрибутов, чтобы дать ему идентификатор. Вы можете использовать prepareForSegue для отправки данных обратно на начальный контроллер с помощью размотки, как и для перемотки вперед. – rdelmar

+0

Забыл упомянуть. Я использую Visual Studio. Я не вижу «Список сцен». Я могу видеть все мои нажатия в раскадровке и в наброске документа (и дать им идентификаторы), а не разматывать сеанс. –

+0

Является ли «LoginSegue» модальным отступлением? Если это так, попробуйте проверить значение свойства «PresentingViewController» на контроллере входа. – pnavk

ответ

1

ОК, нашел решение. Надеюсь, это поможет другим.

Таким образом, в моем контроллере представления вызовов, когда я готовлюсь к службе, я передаю ссылку на контроллер вызова. Тогда у меня есть метод, который вызывается из модального представления.

Вот Xamarin ссылка: http://developer.xamarin.com/recipes/ios/general/storyboard/storyboard_a_tableview/

public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender) 
    { 
     if (segue.Identifier == "LoginSegue") 
     { 
      var destCtrl = segue.DestinationViewController as LoginViewController; 
      if (destCtrl != null) 
      { 
       // pass in a reference to THIS view controller. 
       destCtrl.SetData(this); 
      } 
     } 
     base.PrepareForSegue(segue, sender); 
    } 

Также в Calling View Controller

public void LoggedIn (string someFlag) 
    { 
     Console.WriteLine("Logged in with : " + someFlag); 
     DismissViewController(true, null); 
    } 

И в LoginViewController

public void SetData (CallingViewController callingCtrl) 
    { 
     calllingViewController = callingCtrl; 
    } 

Тогда, когда я готов вернуться.

callingViewController.LoggedIn("the flag");