2013-02-22 16 views
1

我試圖讓這種方法返回一個人,如果他們被選中。我的問題是,我得到一個錯誤,說委託不能返回除void之外的其他類型,這很煩人,因爲我不想讓這個方法返回,除非這兩個動作中的一個發生了。有什麼建議麼?Monotouch導入聯繫人 - 返回類型問題

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; 
       }); 
      }; 
     } 

回答

1

您試圖在內部委託方法中返回函數結果。這是不可能實現的。嘗試使用公共事件。 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); 
       } 
      }); 
     }; 
    } 

請注意,我將此方法標記爲非靜態,以便在我自己的測試示例中使用它。

+0

感謝您的幫助。我建議人們在我的示例中使用'PushViewController(view,animated)'而不是像上面那樣呈現,而@Maxim Korobov也是如此。關閉使用'PopViewControllerAnimated(動畫)' – BRogers 2013-03-01 00:24:47

1

這是我做過什麼來解決這個問題:

 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; 
      }; 
     } 

後,我從這些字段映射,我稱之爲方法

PopulateClientFields (Client mappedClient) 

這種方法將所有EntryElements來傳遞的值然後重新加載視圖:

clientsView.ReloadData(); 

工作就像一個魅力。對不起,我實際上沒有提前發佈。