开发者

Problem with NavigationItem RightBarButtonItem after last update

开发者 https://www.devze.com 2023-02-25 01:31 出处:网络
After the last update (4.0.0) I am having an issue and was wondering of this is a bug and is there a fix.

After the last update (4.0.0) I am having an issue and was wondering of this is a bug and is there a fix.

As you can see from the code below, I am creating a NavigationItem.RightBarButtonItem and adding a delegate to the TouchUpInside event. The button is created but when the touch occurs, the app dies a horribly(see below). Before this update the code ran perfect.

Anyone has any idea? Monotouch team, are you aware of this issue? Maybe I just coded incorrectly and worked before, but the new update has proven I was coding incorrect.

Regards,

Danny

CODE

        //start by creating the view
        RectangleF f = new RectangleF(0f,0f,38f,38f);
        UIView v = new UIView(f);

        //Now create a button with a background
        UIButton b = new UIButton(f);
        b.SetBackgroundImage(UIImage.FromFile("Images/Common/info.png"),UIControlState.Normal);

        //add the button to the view
        v.Add(b);
        b.TouchUpIns开发者_Python百科ide
        //give teh button a delegate action
        b.TouchUpInside += delegate {
            //var vc3 = new iPhone_HomeView();
            //var vc3 = new iPhone_RetardView();
            //vc3.Title = "asdasd";

            //this.NavigationController.PushViewController (vc3, true);
        };

        //now apply the view to the navigation bar on the right
            NavigationItem.RightBarButtonItem = new UIBarButtonItem(v);
            NavigationItem.RightBarButtonItem.Width = 38f;

ERROR

Stacktrace:

at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) at MonoTouch.UIKit.UIApplication.Main (string[],string,string) [0x00038] in /Users/plasma/Source/iphone/monotouch/UIKit/UIApplication.cs:26 at MonoTouch.UIKit.UIApplication.Main (string[]) [0x00000] in /Users/plasma/Source/iphone/monotouch/UIKit/UIApplication.cs:31 at SmartPhoneSolution.Application.Main (string[]) [0x00000] in /Users/aprdev/Projects/SmartPhoneSolution/SmartPhoneSolution/Main.cs:15 at (wrapper runtime-invoke) .runtime_invoke_void_object (object,intptr,intptr,intptr)

Native stacktrace:

0   SmartPhoneSolution1                 0x000d0db5 mono_handle_native_sigsegv + 343
1   SmartPhoneSolution1                 0x0000f80c mono_sigsegv_signal_handler + 322
2   libSystem.B.dylib                   0x996fb45b _sigtramp + 43
3   ???                                 0xffffffff 0x0 + 4294967295
4   UIKit                               0x01b92de0 -[UIControl sendAction:to:forEvent:] + 67
5   UIKit                               0x01b95262 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
6   UIKit                               0x01b93e0f -[UIControl touchesEnded:withEvent:] + 458
7   UIKit                               0x01b2b3d0 -[UIWindow _sendTouchesForEvent:] + 567
8   UIKit                               0x01b0ccb4 -[UIApplication sendEvent:] + 447
9   UIKit                               0x01b119bf _UIApplicationHandleEvent + 7672
10  GraphicsServices                    0x05768822 PurpleEventCallback + 1550
11  CoreFoundation                      0x00debff4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
12  CoreFoundation                      0x00d4c807 __CFRunLoopDoSource1 + 215
13  CoreFoundation                      0x00d49a93 __CFRunLoopRun + 979
14  CoreFoundation                      0x00d49350 CFRunLoopRunSpecific + 208
15  CoreFoundation                      0x00d49271 CFRunLoopRunInMode + 97
16  GraphicsServices                    0x0576700c GSEventRunModal + 217
17  GraphicsServices                    0x057670d1 GSEventRun + 115
18  UIKit                               0x01b15af2 UIApplicationMain + 1160
19  ???                                 0x0ba72744 0x0 + 195503940
20  ???                                 0x0ba7267a 0x0 + 195503738
21  ???                                 0x090bfb9e 0x0 + 151780254
22  ???                                 0x090bfaea 0x0 + 151780074
23  ???                                 0x090bfb75 0x0 + 151780213
24  SmartPhoneSolution1                 0x0000f5c7 mono_jit_runtime_invoke + 1332
25  SmartPhoneSolution1                 0x001ed281 mono_runtime_invoke + 137
26  SmartPhoneSolution1                 0x001ef968 mono_runtime_exec_main + 669
27  SmartPhoneSolution1                 0x001eed52 mono_runtime_run_main + 843
28  SmartPhoneSolution1                 0x000a3153 mono_jit_exec + 200
29  SmartPhoneSolution1                 0x002a16b8 main + 4155
30  SmartPhoneSolution1                 0x00002949 _start + 208
31  SmartPhoneSolution1                 0x00002878 start + 40

Debug info from gdb:

/tmp/mono-gdb-commands.WL0ypx:1: Error in sourced command file: unable to debug self

================================================================= 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.

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object 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) [0x00038] in /Users/plasma/Source/iphone/monotouch/UIKit/UIApplication.cs:26 at MonoTouch.UIKit.UIApplication.Main (System.String[] args) [0x00000] in /Users/plasma/Source/iphone/monotouch/UIKit/UIApplication.cs:31 at SmartPhoneSolution.Application.Main (System.String[] args) [0x00000] in /Users/aprdev/Projects/SmartPhoneSolution/SmartPhoneSolution/Main.cs:15


I had a similar problem last week. It seems like MT 4 is more aggressive in it's GC than earlier versions, and things that I was able to get away with before are now causing problems.

Try declaring your UIButton at the class level, instead of scoping it locally.


Same thing happened to me porting existing Objective-C code. This solution is to make sure your button is an instance member of your class. This code works well (extra viewcontroller boilerplate code omitted):

public partial class HomeViewController : UIViewController
{
    private UIButton _settingsButton;

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        ConfigureNavigationBar();
    }

    private void ConfigureNavigationBar()
    {
        // Add the Settings icon to nav bar

        _settingsButton = UIButton.FromType(UIButtonType.Custom);

        _settingsButton.SetImage(UIImage.FromBundle("Images/settings.png"),
            UIControlState.Normal);

        _settingsButton.SizeToFit();

        _settingsButton.TouchUpInside += (sender, e) =>
            Console.WriteLine("clicked");

        this.NavigationItem.RightBarButtonItem =
            new UIBarButtonItem(_settingsButton);
    }
}

See the last paragraph ("When to Keep References to Objects") in the MonoTouch documentation: API Design

0

精彩评论

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