Hello Alex,

By default `btouch` will add, for non value-type parameters, the following:

if (argument == null)
    throw new ArgumentNullException ("argument");
...

If you add [NullAllowed] to `argument` then this (extra) code won't be
generated and `null` will be provided to the native code.

However that does not tell you if a null is really accepted (or not).
In general documentation helps (but even Apple documentation is not
100% clear when null are allowed) and samples can be useful too. Other
times the API just "seems" to require null to work, e.g.
SetImage(UIImage img) where images are optional and there's no other
method to clear an already set image.

When in doubt it's easier to write a unit test (e.g. using Touch.Unit [1]).

a. add the "suspected" [NullAllowed] to the bind'ed API and rebuild the bindings

b. add a test, e.g.

                [Test]
                public void CustomView_Null ()
                {
                        using (var btn = new UIBarButtonItem ("title",
UIBarButtonItemStyle.Bordered, null, null)) {
                                Assert.Null (btn.CustomView, "default");
                                btn.CustomView = null; // nullable
                        }
                }

c. If the test pass (i.e. no crash or ObjC exception) then it's likely
that `null` is allowed. So you can keep the [NullAllowed] attribute in
your bindings.

Sebastien

[1] http://spouliot.wordpress.com/category/touch-unit/

On Tue, Aug 28, 2012 at 9:28 AM, Alex Soto <[email protected]> wrote:
> Hi sebastien and thanks for your response, im a new with unit test
> could you elaborate or point me on how to implement this?
>
> Sounds really helpful
>
> Alex
>
> El 28/08/2012, a las 07:59 a.m., Sebastien Pouliot
> <[email protected]> escribió:
>
>> To avoid duplication: http://stackoverflow.com/q/12155558/220643
>>
>> Sebastien
>>
>> On Mon, Aug 27, 2012 at 10:03 AM, René Ruppert <[email protected]> 
>> wrote:
>>> Hi,
>>>
>>> sorry, I don't understand at all why this is happening. If the
>>> UIPopoverController is working without subclassing, it should also work with
>>> subclassing - after all, the base c'tor is getting called!? I'm totally
>>> puzzled.
>>> I can subclass any UIViewController in MonoTouch without issue, why not that
>>> one? Why it that popover NULL?
>>>
>>> René
>>>
>>>
>>> 2012/8/27 Alex Soto <[email protected]>
>>>>
>>>>
>>>>
>>>> Ok, if you subclass you need to implement all methods and properties
>>>> needed, and how to know whats needed ?? You need too look at original ObjC
>>>> code in this case (thank God it is very well documented) you need to see
>>>> PSPDFViewController.h, you can find it inside PSPDFKitExample xcode project
>>>>
>>>> /// Saves the popoverController if currently displayed.
>>>> @property(nonatomic, strong) UIPopoverController *popoverController;
>>>>
>>>> Unfortunately it doesn't mention that popoverController can be nil or null
>>>> in c# world so it must be implemented
>>>>
>>>> The error its showing you in this case ,this is the key part of the error
>>>>
>>>> System.ArgumentNullException: Argument cannot be null.
>>>> Parameter name: value
>>>>  at AlexTouch.PSPDFKit.PSPDFViewController.set_PopoverController
>>>> (MonoTouch.UIKit.UIPopoverController value) [0x00000] in <filename
>>>> unknown>:0
>>>>
>>>>
>>>> There is a property PopoverController that cannot be null, you should be
>>>> fine doing
>>>>
>>>> var oController = new SubclassedController(oDoc)
>>>> {
>>>> ModalPresentationStyle =
>>>> MonoTouch.UIKit.UIModalPresentationStyle.FullScreen,
>>>> ModalTransitionStyle =
>>>> MonoTouch.UIKit.UIModalTransitionStyle.CoverVertical,
>>>>
>>>> PopoverController = new PopoverController();
>>>>
>>>> } ;
>>>>
>>>>
>>>> I hope this helps, and also I hope I have explained myself hehe.
>>>>
>>>> Alex
>>>>
>>>>
>>>>
>>>>
>>>> El 27/08/2012, a las 07:31, René Ruppert <[email protected]>
>>>> escribió:
>>>>
>>>> Hi,
>>>>
>>>> If I use this code, everything is fine. I just call
>>>> PdfViewerController2.ShowModally(). In there, you see a part that is
>>>> commented out. If I use that subclass instead of PSPDFViewController
>>>> directly, it fails and I get the exception below.
>>>> Can somebody please explain what is going on? The PSPDFViewController is
>>>> coming from a bound library.
>>>>
>>>> public class SubclassedController : PSPDFViewController
>>>> {
>>>> private SubclassedController (PSPDFDocument oDoc) : base(oDoc)
>>>> {
>>>> }
>>>>
>>>> public static void ShowModally(string sFilename)
>>>> {
>>>> PSPDFDocument oDoc = new PSPDFDocument(NSUrl.FromFilename(sFilename));
>>>>
>>>> // This is working.
>>>>                        var oController = new PSPDFViewController(oDoc)
>>>>
>>>> {
>>>> ModalPresentationStyle =
>>>> MonoTouch.UIKit.UIModalPresentationStyle.FullScreen,
>>>> ModalTransitionStyle =
>>>> MonoTouch.UIKit.UIModalTransitionStyle.CoverVertical
>>>> } ;
>>>>
>>>>
>>>>
>>>>                        // This isn't!
>>>>                        /*var oController = new SubclassedController(oDoc)
>>>> {
>>>> ModalPresentationStyle =
>>>> MonoTouch.UIKit.UIModalPresentationStyle.FullScreen,
>>>> ModalTransitionStyle =
>>>> MonoTouch.UIKit.UIModalTransitionStyle.CoverVertical
>>>> } ;*/
>>>>
>>>> AppDelegateBase.BaseAppDelegate.MainController.PresentViewController(oController,
>>>> true, delegate {} );
>>>> }
>>>> }
>>>>
>>>> {System.ArgumentNullException: Argument cannot be null.
>>>> Parameter name: value
>>>>  at AlexTouch.PSPDFKit.PSPDFViewController.set_PopoverController
>>>> (MonoTouch.UIKit.UIPopoverController value) [0x00000] in <filename
>>>> unknown>:0
>>>>  at (wrapper managed-to-native)
>>>> MonoTouch.ObjCRuntime.Messaging:void_objc_msgSendSuper (intptr,intptr)
>>>>  at AlexTouch.PSPDFKit.PSPDFViewController.ReloadData () [0x00000] in
>>>> <filename unknown>:0
>>>>  at (wrapper managed-to-native)
>>>> MonoTouch.ObjCRuntime.Messaging:void_objc_msgSendSuper_IntPtr_bool_IntPtr
>>>> (intptr,intptr,intptr,bool,intptr)
>>>>  at MonoTouch.UIKit.UIViewController.PresentViewController
>>>> (MonoTouch.UIKit.UIViewController viewControllerToPresent, Boolean 
>>>> animated,
>>>> MonoTouch.Foundation.NSAction completionHandler) [0x0006a] in
>>>> /Developer/MonoTouch/Source/monotouch/src/UIKit/UIViewController.g.cs:482
>>>>  at BrainloopMobile.PdfViewer.PdfViewerController2.ShowModally
>>>> (System.String sFilename) [0x00023] in
>>>> /Users/rene/Documents/Develop/Projects/BrainloopMobile/220/BrainloopMobile/BrainloopMobile/Controllers/PdfViewer/PdfViewerController2.cs:22
>>>>  at BrainloopMobile.ProgressPreviewItem.PreviewPDF () [0x00000] in
>>>> /Users/rene/Documents/Develop/Projects/BrainloopMobile/220/BrainloopMobile/BrainloopMobile/Progress/ProgressPreviewItem.cs:446
>>>>  at BrainloopMobile.ProgressPreviewItem.ProgressEnded () [0x001d0] in
>>>> /Users/rene/Documents/Develop/Projects/BrainloopMobile/220/BrainloopMobile/BrainloopMobile/Progress/ProgressPreviewItem.cs:428
>>>>  at BrainloopMobile.Progress.ProgressDelegate.BaseProgressEnded
>>>> (PROGRESS_STATUS eStatus) [0x00007] in
>>>> /Users/rene/Documents/Develop/Projects/BrainloopMobile/220/BrainloopMobile/BrainloopMobile/Progress/Base/ProgressDelegate.cs:55
>>>>  at
>>>> BrainloopMobile.Progress.ModalProgressController+<EndProgress>c__AnonStorey3A.<>m__B3
>>>> () [0x0004c] in
>>>> /Users/rene/Documents/Develop/Projects/BrainloopMobile/220/BrainloopMobile/BrainloopMobile/Progress/Base/ModalProgressController.cs:422
>>>>  at MonoTouch.UIKit.UIView+<Animate>c__AnonStorey12.<>m__14 (Boolean x)
>>>> [0x0000b] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIView.cs:110
>>>>  at MonoTouch.UIKit.UIView.TrampolineUICompletionHandler (IntPtr block,
>>>> Boolean finished) [0x00053] in
>>>> /Developer/MonoTouch/Source/monotouch/src/UIKit/UIView.g.cs:1604
>>>>  at (wrapper native-to-managed)
>>>> MonoTouch.UIKit.UIView:TrampolineUICompletionHandler (intptr,int)
>>>>  at (wrapper managed-to-native)
>>>> MonoTouch.UIKit.UIApplication:UIApplicationMain 
>>>> (int,string[],intptr,intptr)
>>>>  at MonoTouch.UIKit.UIApplication.Main (System.String[] args,
>>>> System.String principalClassName, System.String delegateClassName) 
>>>> [0x00042]
>>>> in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:29
>>>>  at BrainloopMobile.Application.Main (System.String[] args) [0x00000] in
>>>> /Users/rene/Documents/Develop/Projects/BrainloopMobile/220/BrainloopMobile/BrainloopMobile/Main.cs:15
>>>> }
>>>>
>>>> René
>>>
>>>
>>> _______________________________________________
>>> MonoTouch mailing list
>>> [email protected]
>>> http://lists.ximian.com/mailman/listinfo/monotouch
>>>
_______________________________________________
MonoTouch mailing list
[email protected]
http://lists.ximian.com/mailman/listinfo/monotouch

Reply via email to