1

私は、このメソッドが選択された場合に人を返すようにしようとしています。void私の問題は、これら2つのアクションのいずれかが発生しない限り、このメソッドを返したくないため、デリゲートが面倒な型以外を返すことができないというエラーが表示されることです。助言がありますか?

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

2 に答える 2

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

魅力のように働きました。申し訳ありませんが、実際にはこれをもっと早く投稿しませんでした。

于 2013-03-01T00:21:39.263 に答える
1

内部デリゲート メソッドで関数の結果を返そうとしています。実装することはできません。代わりに公開イベントを使用してみてください。すなわち:

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

私自身のテストサンプルで使用するために、このメソッドを非静的としてマークしていることに注意してください。

于 2013-02-23T13:26:07.357 に答える