2013-10-03 2 views
1

Я работаю над примерами Monotouch/Xamarin и пытается сшить сценарную сцену и аутентификацию Windows Azure Mobile Services (WAMS). У меня есть работа независимо, но я просто не могу спровоцировать segue после действительного входа в WAMS. В функции DoLogin() не возникает ошибка, и AlertView работает. Кажется, что он пропускает PerformSegue. PerformSegue в ViewDidLoad() отлично работает.Monotouch iOS - PerformSegue от функции

public override void ViewDidLoad() 
    { 
     base.ViewDidLoad();  

     btn_Facebook.TouchUpInside += (sender, e) => { 
      Console.WriteLine("Facebook clicked"); 
      DoLogin(MobileServiceAuthenticationProvider.Facebook); 
     }; 

     btn_Twitter.TouchUpInside += (sender, e) => 
     { 
      Console.WriteLine("Twitter clicked"); 
      this.PerformSegue("seg_Login", this); 
      // DoLogin(MobileServiceAuthenticationProvider.Twitter); 
     }; 
} 

private void DoLogin(MobileServiceAuthenticationProvider provider) 
    { 
     string applicationKey = "[removed]"; 
     string applicationUrl = "https://[removed].azure-mobile.net/"; 

     MobileServiceClient client = new MobileServiceClient(applicationUrl, applicationKey); 

     var task = client.LoginAsync(this, provider).ContinueWith(t => 
     { 
      MobileServiceUser user = t.Result; 

      this.BeginInvokeOnMainThread(() => 
      { 
       this.PerformSegue("seg_Login", this); 

       UIAlertView alert = new UIAlertView("Logged In!", string.Format("Hello user {0}", user.UserId), null, "OK"); 
       alert.Show(); 
      }); 
     }); 
    } 

ответ

1

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

this.BeginInvokeOnMainThread(() => 
      { 
       Timer tm = new Timer(new TimerCallback((state) => 
       { 
        this.InvokeOnMainThread(new NSAction(() => 
        { 
         this.PerformSegue("seg_Login", this); 
        })); 
       }), null, 500, Timeout.Infinite); 
      }); 
0

Соответствует ли текущий класс реализации подготовкой к успеху или вы буквально подталкиваете все это к раскадровке. Я бы предложил реализовать prepareforseque и поставить точку останова там, чтобы узнать, не доходит ли до этого.

+0

Спасибо за предложение. Я пытался просто нажать все на раскадровку с помощью PerformSegue, который, похоже, отлично работает в ViewDidLoad. Я принял ваш совет и внедрил PrepareForSegue с точкой останова. Он попадает в точку останова, но сейг никогда не срабатывает. –

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