2013-02-22 4 views
1

J'essaie d'avoir cette méthode pour renvoyer une personne si elle est sélectionnée. Mon problème est que j'obtiens une erreur disant que le délégué ne peut pas renvoyer un type autre que void qui est ennuyeux parce que je ne veux pas que cette méthode retourne à moins que l'une de ces deux actions ne se soit produite. Aucune suggestion?Monotouch Import Contact - Type de retour Numéro

public static ABPerson ImportContact() 
     { 
      // Create placeholder for contact 
      ABPeoplePickerNavigationController _contactController = new ABPeoplePickerNavigationController(); 
      AppDelegate.navigation.PresentViewController (_contactController, true, null); 

      _contactController.Cancelled += delegate { 
       AppDelegate.navigation.DismissViewController (true, null); 
       return; 
      }; 

      _contactController.SelectPerson += delegate(object sender, ABPeoplePickerSelectPersonEventArgs e) { 
       _importedContact = e.Person.GetEmails().FirstOrDefault; 
       AppDelegate.navigation.DismissViewController (true, delegate { 
        return e.Person; 
       }); 
      }; 
     } 

Répondre

1

Vous essayez de renvoyer le résultat de la fonction dans la méthode de délégué interne. Ce n'est pas possible de l'implémenter. Essayez d'utiliser l'événement public à la place. I. e .:

public event Action<ABPerson> OnPersonSelect; 
    public void ImportContact() 
    { 
     // Create placeholder for contact 
     ABPeoplePickerNavigationController _contactController = new ABPeoplePickerNavigationController(); 
     NavigationController.PresentViewController (_contactController, true, null); 

     _contactController.Cancelled += delegate { 
      NavigationController.DismissViewController (true, null); 
      return; 
     }; 

     _contactController.SelectPerson += delegate(object sender, ABPeoplePickerSelectPersonEventArgs e) { 
      var _importedContact = e.Person; 
      NavigationController.DismissViewController (true, delegate { 
       if (OnPersonSelect != null) 
       { 
        OnPersonSelect(_importedContact); 
       } 
      }); 
     }; 
    } 

Notez que je marque cette méthode comme non-statique pour l'utiliser dans mon propre échantillon de test.

+0

Merci pour l'aide. Je recommande aux gens d'utiliser 'PushViewController (voir, animé)' à la place du présent comme ci-dessus dans mon exemple et @Maxim Korobov aussi bien. Rejeter en utilisant 'PopViewControllerAnimated (animé)' – BRogers

1

C'est ce que je l'ai fait pour le résoudre:

 private static void ImportContact() 
     { 
      if (_contactController == null) 
       _contactController = new ABPeoplePickerNavigationController(); 
      AppDelegate.navigation.PresentViewController (_contactController, true, null); 

      _contactController.Cancelled += delegate { 
       if (!AppDelegate.navigation.PresentedViewController.IsBeingPresented) 
        AppDelegate.navigation.DismissViewController (true, null); 
       return; 
      }; 

      _contactController.SelectPerson += delegate(object sender, ABPeoplePickerSelectPersonEventArgs e) { 
       if (!AppDelegate.navigation.PresentedViewController.IsBeingPresented) { 
        AppDelegate.navigation.DismissViewController (true, delegate { 
         MapImportedContact (e.Person); 
        }); 
       } 
       return; 
      }; 
     } 

Après avoir mapper les champs de cela, j'ai appelé une méthode

PopulateClientFields (Client mappedClient) 

Cette méthode permet de définir tous les EntryElements à la valeur passée dans et puis rechargé la vue avec:

clientsView.ReloadData(); 

Travaillé comme un charme. Désolé, je n'ai pas posté cela plus tôt.