开发者

Monotouch: understand the delegate mechanism pattern

开发者 https://www.devze.com 2023-02-14 02:50 出处:网络
I didin\'t completely understand the delegate mechanism in monotouch. Can anyone help me to understand this concept?

I didin't completely understand the delegate mechanism in monotouch. Can anyone help me to understand this concept?

The question is simple. I'll try to map what I've done in Objective C in Monotouch.

For example, suppose I've creating a UIPopoverController in Objective C inside MyController. In Objective C the code is the following:

@interface MyController : UIViewController <UIPopoverControllerDelegate> {
    // ...
}
// ...
@end

Inside MyController I can istantiate a UIPopoverController like the following:

UIPopoverController *popover = // ...
popover.delegate = self;

and finally methods used in the delegate.

So, what about Monotouch?

Through this code I can istantiate the UIPopoverController inside MyController class that extends UIViewController inside a specific TouchUpInside event handler:

popover = new UIPopoverController(new CustomController());
popover.PopoverContentSize = new SizeF(200f, 200f);
popover.PresentFromRect(button.Frame, containerForBu开发者_开发百科ttonView, UIPopoverArrowDirection.Left, true);

P.S. An important aspect is to put popover reference as a member class and not as a local variable inside the handler because the monotouch GC works well!!!

Thank you in advance.


This really has more to do with C# than MonoTouch itself. In MonoTouch, UIPopoverControllerDelegate is a class, and C# doesn't allow multiple inheritance, so you can't translate code one to one with Obj-C. There's an easier way out though (code below compiles, but obviously doesn't work):

public class MyController: UIViewController {
        public void mymethod(){
            var popover = new UIPopoverController();
            popover.DidDismiss += HandlePopoverDidDismiss;
            popover.PopoverContentSize = new SizeF(200f, 200f);
            popover.PresentFromRect(button.Frame, containerForButtonView, UIPopoverArrowDirection.Left, true);
        }

        void HandlePopoverDidDismiss (object sender, EventArgs e)
        {
            Console.WriteLine("Working!");
        }
    }
}

As you can see, you can add an event handler to to the DidDismiss event in the popover, which will do what you want. In general, all events that in Obj-C are handled by the delegate in all controls can be used this way. You can also write the method inline, like this:

popover.DidDismiss += delegate {
    //dosomething
};

Hope this is what you're looking for.


This doesn't answer your question specific to your UIPopovercontroller I think you will find this link from the Monotouch Docs useful. It explains the differences between Objective-C delegates and C# delegates with relation to Monotouch. With regards to your specific problem, I havent got time to whip up a quick test case to understand it fully but figured I'd post that link so you've got something to read in the mean time!

0

精彩评论

暂无评论...
验证码 换一张
取 消