0
votes

After I have updated monotouch to Version 5.2.13 my App crashes when I touched inside a UIButton.

About my Code: (it's a question of a LoginView):

I have a UIViewController which includes a ScrollView. For each User the ScrollView provides a UIView (the UserImageView). This UserImageView contains a UserImage, Username and so on. Over the UserImage lays a UIButton which should catches the Touch-Events to selected a User. This Button causes the Exception below more precisely the HitTest method from the UIView.

I get the following Stacktrace:

Stacktrace:

  at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) <IL 0x0009f, 0xffffffff>
  at MonoTouch.UIKit.UIApplication.Main (string[],string,string) [0x00042] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:29
  at MF.Stationaer.iPad.Application.Main (string[]) <IL 0x00028, 0x00073>
  at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff>

Native stacktrace:

0   MFiPad_MD            0x0009061c mono_handle_native_sigsegv + 284
1   MFiPad_MD            0x000059a8 mono_sigsegv_signal_handler + 248
2   libsystem_c.dylib                   0x92cd259b _sigtramp + 43
3   ???                                 0xffffffff 0x0 + 4294967295
4   UIKit                               0x0228c741 __38-[UIView(Geometry) hitTest:withEvent:]_block_invoke_0 + 96
5   CoreFoundation                      0x0116cf1a __NSArrayChunkIterate + 362
6   CoreFoundation                      0x01138635 __NSArrayEnumerate + 997
7   CoreFoundation                      0x01138026 -[NSArray enumerateObjectsWithOptions:usingBlock:] + 102
8   UIKit                               0x0228c66b -[UIView(Geometry) hitTest:withEvent:] + 646
9   UIKit                               0x0228c765 __38-[UIView(Geometry) hitTest:withEvent:]_block_invoke_0 + 132
10  CoreFoundation                      0x0116cf1a __NSArrayChunkIterate + 362
11  CoreFoundation                      0x01138635 __NSArrayEnumerate + 997
12  CoreFoundation                      0x01138026 -[NSArray enumerateObjectsWithOptions:usingBlock:] + 102
13  UIKit                               0x0228c66b -[UIView(Geometry) hitTest:withEvent:] + 646
14  UIKit                               0x022a1157 -[UIScrollView hitTest:withEvent:] + 79
15  UIKit                               0x0228c765 __38-[UIView(Geometry) hitTest:withEvent:]_block_invoke_0 + 132
16  CoreFoundation                      0x0116cf1a __NSArrayChunkIterate + 362
17  CoreFoundation                      0x01138635 __NSArrayEnumerate + 997
18  CoreFoundation                      0x01138026 -[NSArray enumerateObjectsWithOptions:usingBlock:] + 102
19  UIKit                               0x0228c66b -[UIView(Geometry) hitTest:withEvent:] + 646
20  UIKit                               0x0228c765 __38-[UIView(Geometry) hitTest:withEvent:]_block_invoke_0 + 132
21  CoreFoundation                      0x0116cf1a __NSArrayChunkIterate + 362
22  CoreFoundation                      0x01138635 __NSArrayEnumerate + 997
23  CoreFoundation                      0x01138026 -[NSArray enumerateObjectsWithOptions:usingBlock:] + 102
24  UIKit                               0x0228c66b -[UIView(Geometry) hitTest:withEvent:] + 646
25  UIKit                               0x0228c765 __38-[UIView(Geometry) hitTest:withEvent:]_block_invoke_0 + 132
26  CoreFoundation                      0x0116cf1a __NSArrayChunkIterate + 362
27  CoreFoundation                      0x01138635 __NSArrayEnumerate + 997
28  CoreFoundation                      0x01138026 -[NSArray enumerateObjectsWithOptions:usingBlock:] + 102
29  UIKit                               0x0228c66b -[UIView(Geometry) hitTest:withEvent:] + 646
30  UIKit                               0x02286dbd +[UIWindow _hitTestToPoint:pathIndex:forEvent:] + 378
31  UIKit                               0x02258ca0 _UIApplicationHandleEvent + 1648
32  GraphicsServices                    0x047c5ef5 PurpleEventCallback + 1274
33  CoreFoundation                      0x011a9195 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
34  CoreFoundation                      0x0110dff2 __CFRunLoopDoSource1 + 146
35  CoreFoundation                      0x0110c8da __CFRunLoopRun + 2218
36  CoreFoundation                      0x0110bd84 CFRunLoopRunSpecific + 212
37  CoreFoundation                      0x0110bc9b CFRunLoopRunInMode + 123
38  GraphicsServices                    0x047c47d8 GSEventRunModal + 190
39  GraphicsServices                    0x047c488a GSEventRun + 103
40  UIKit                               0x02258626 UIApplicationMain + 1163
41  ???                                 0x0b96e514 0x0 + 194438420
42  ???                                 0x0b96d6c0 0x0 + 194434752
43  ???                                 0x0b96d33c 0x0 + 194433852
44  ???                                 0x0b96d42f 0x0 + 194434095
45  MFiPad_MD            0x00009d12 mono_jit_runtime_invoke + 722
46  MFiPad_MD            0x00169e4e mono_runtime_invoke + 126
47  MFiPad_MD            0x0016df34 mono_runtime_exec_main + 420
48  MFiPad_MD            0x001732e5 mono_runtime_run_main + 725
49  MFiPad_MD            0x00066f15 mono_jit_exec + 149
50  MFiPad_MD            0x002115d5 main + 2837
51  MFiPad_MD            0x00002d65 start + 53

Got a SIGSEGV while executing native code. This usually indicates a fatal error in the mono runtime or one of the native libraries used by your application.

Here is the important Part of my Code:

public class LoginViewController : UIViewController
{
    ... 
    public override void ViewDidLoad()
    {
        ...

        BuildUserUI();

        ...
    }

    private void BuildUserUI()
    {
        currentIconLocation = new PointF(50, 10);

        for (var i = 0; i < UserList.List.Count; i++)
            CreateUserInGrid(UserList.GetUserByIndex(i));
    }

    private void CreateUserInGrid(LoginUser user)
    {
        var imgFrame = new RectangleF(currentIconLocation.X, currentIconLocation.Y, 140, 170);

        var loginImg = new UILoginImage(imgFrame);
        loginImg.Image = user.Image ?? defaultUserImage.CGImage;
        loginImg.Name = user.Nachname;

        if (!string.IsNullOrEmpty(user.Vorname))
            loginImg.Name += ", " + user.Vorname;

        loginImg.Tag = user.UserIndex;
        loginImg.AddTarget(this, new Selector("ShowNumberPad:"), UIControlEvent.TouchUpInside);
        loginImg.LoginUser = user;
        scrollView.AddSubview(loginImg);
        loginImages.Add(loginImg);

        limitedScrollView.UserInteractionEnabled = false;

        var newSize = new SizeF(scrollView.Frame.Size.Width, currentIconLocation.Y + imgFrame.Size.Height + 20);
        scrollView.ContentSize = newSize;
        limitedScrollView.ContentSize = new SizeF(limitedScrollView.Frame.Size.Width, limitedScrollView.Frame.Size.Height);

        currentIconLocation.X += imgFrame.Size.Width;

        if (currentIconLocation.X + imgFrame.Size.Width > scrollView.Frame.Size.Width)
        {
            currentIconLocation.Y += imgFrame.Size.Height;
            currentIconLocation.X = 50;
        }
    }

    [Export("ShowNumberPad:")]
    private void ShowNumberPad(NSObject sender)
    {
        ...
    }
}

public class UILoginImage : UIView
{
    [Export("initWithFrame:")]
    public UILoginImage(RectangleF frame)
        : base(frame)
    {
        var shadowFrame = new RectangleF(0, 0, 117, 148);

        wrapperControl = new UIControl(shadowFrame);
        AddSubview(wrapperControl);

        shadowImage = new UIImageView(shadowFrame);
        shadowImage.Image = ImageCache.GetResourceImage("Images/Login/LoginSchatten.png");
        wrapperControl.AddSubview(shadowImage);

        var mainBackFrame = new RectangleF(8, 9, 98, 128);
        whiteBackgroundImage = new UIImageView(mainBackFrame);
        whiteBackgroundImage.Image = ImageCache.GetResourceImage("Images/Login/Singlewhite.png");
        wrapperControl.AddSubview(whiteBackgroundImage);

        var imageFrame = new RectangleF(13, 15, 87, 116);

        clickHelper = UIButton.FromType(UIButtonType.Custom);
        clickHelper.Frame = imageFrame;
        wrapperControl.AddSubview(clickHelper);

        userImage = new UIImageView(imageFrame);
        AddSubview(userImage);

        var mitarbeiterlabelFrame = new RectangleF(-12, 137, 140, 25);
        mitarbeiterNameLabel = new FontSizeLabel(mitarbeiterlabelFrame);
        mitarbeiterNameLabel.TextAlignment = UITextAlignment.Center;
        mitarbeiterNameLabel.Font = UIFont.SystemFontOfSize(12);
        mitarbeiterNameLabel.Opaque = false;
        mitarbeiterNameLabel.BackgroundColor = UIColor.Clear;
        AddSubview(mitarbeiterNameLabel);

        var benutzerlabelFrame = new RectangleF(mitarbeiterlabelFrame.X, mitarbeiterlabelFrame.Y + 13, 140, 25);
        benutzerNameLabel = new FontSizeLabel(benutzerlabelFrame);
        benutzerNameLabel.TextAlignment = UITextAlignment.Center;
        benutzerNameLabel.Font = UIFont.SystemFontOfSize(10);
        benutzerNameLabel.Opaque = false;
        benutzerNameLabel.BackgroundColor = UIColor.Clear;
        benutzerNameLabel.TextColor = UIColor.DarkGray;
        AddSubview(benutzerNameLabel);
    }

    public void AddTarget(NSObject target, Selector action, UIControlEvent controlEvents)
    {
        clickHelper.AddTarget(target, action, controlEvents);
    }

    public void RemoveTarget(NSObject target, Selector action, UIControlEvent controlEvents)
    {
        clickHelper.RemoveTarget(target, action, controlEvents);
    }
}
1
This can occurs when an instance (e.g. of your UIButton) is no more referenced and the GC collects it. However without seeing the source code it's not possible to confirm it.poupou

1 Answers

0
votes

I'm not sure your use of AddTarget is a good way to hook up a UIButton's click.

You should be using clickHelper.TouchUpInside to wire up click events. This is a standard C# event.

Another option would be to wire up an action to this event inside your XIB file in XCode.