【问题标题】:Problem with NavigationItem RightBarButtonItem after last update上次更新后 NavigationItem RightBarButtonItem 出现问题
【发布时间】:2011-04-14 15:05:01
【问题描述】:

在上次更新 (4.0.0) 之后,我遇到了一个问题,想知道这是一个错误,是否有修复。

从下面的代码可以看出,我正在创建一个 NavigationItem.RightBarButtonItem 并向 TouchUpInside 事件添加一个委托。按钮已创建,但当触摸发生时,应用程序会死掉(见下文)。在此更新之前,代码运行完美。

有人知道吗? Monotouch 团队,你知道这个问题吗?也许我只是编码错误并且之前工作过,但是新的更新证明我编码不正确。

问候,

丹尼

代码

        //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.TouchUpInside
        //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;

错误

堆栈跟踪:

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

本机堆栈跟踪:

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

来自 gdb 的调试信息:

/tmp/mono-gdb-commands.WL0ypx:1:源命令文件中的错误: 无法自我调试

================================================ =================== 执行本机代码时获得 SIGSEGV。这通常表明 单声道运行时或本机库之一中的致命错误

由您的应用程序使用。

未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例 在(包装器托管到本机) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr) 在 MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00038] 在 /Users/plasma/Source/iphone/monotouch/UIKit/UIApplication.cs:26 在 MonoTouch.UIKit.UIApplication.Main (System.String[] args) [0x00000] 在 /Users/plasma/Source/iphone/monotouch/UIKit/UIApplication.cs:31 在 SmartPhoneSolution.Application.Main (System.String[] args) [0x00000] 在 /Users/aprdev/Projects/SmartPhoneSolution/SmartPhoneSolution/Main.cs:15

【问题讨论】:

  • 在表格视图中选择单元格时遇到类似错误。只有在更新到 MonoTouch 4 之后
  • 好的。简单的修复。确保对象层次结构中的至少一个对象在类范围内。将确保保留其下方的所有内容。

标签: xamarin.ios rightbarbuttonitem navigationitem


【解决方案1】:

上周我有一个similar problem。 MT 4 的 GC 似乎比早期版本更具侵略性,而我之前能够逃脱的事情现在导致了问题。

尝试在类级别声明您的 UIButton,而不是在本地范围内。

【讨论】:

    【解决方案2】:

    我在移植现有的 Objective-C 代码时也发生了同样的事情。此解决方案是确保您的按钮是您的类的实例成员。此代码运行良好(省略了额外的 viewcontroller 样板代码):

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

    请参阅 MonoTouch 文档中的最后一段(“何时保留对对象的引用”):API Design

    【讨论】:

    • 公平地说,Jason 已经正确回答了这个问题,我只是用有效的代码进行放大。我试图对他的回答投赞成票,但我在此帐户上的声望点还不够。
    • 呵呵……差不多!现在最多11分……还需要15分才能投票。不过谢谢!
    • @Theofanis -- 两年过去了,终于投票给 Jason 以获得他应得的荣誉! ;-)
    • 我现在有了必要的声誉:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    相关资源
    最近更新 更多