Проблема с NavigationItem RightBarButtonItem после последнего обновления - PullRequest
0 голосов
/ 14 апреля 2011

После последнего обновления (4.0.0) у меня возникла проблема, и мне было интересно, что это ошибка и есть ли исправление.

Как видно из кода ниже, я создаю NavigationItem.RightBarButtonItem и добавляю делегата в событие TouchUpInside. Кнопка создается, но когда происходит касание, приложение ужасно умирает (см. Ниже). До этого обновления код работал отлично.

У кого-нибудь есть идеи? Команда Monotouch, вам известна эта проблема? Может быть, я просто неправильно кодировал и работал раньше, но новое обновление доказало, что я неправильно кодировал.

С уважением,

Danny

код

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

ERROR

StackTrace:

at (управляемая оболочкой нативная версия) MonoTouch.UIKit.UIApplication.UIApplicationMain (int, string [], intptr, intptr) в MonoTouch.UIKit.UIApplication.Main (строка [], строка, строка) [0x00038] в /Users/plasma/Source/iphone/monotouch/UIKit/UIApplication.cs:26 в MonoTouch.UIKit.UIApplication.Main (строка []) [0x00000] в /Users/plasma/Source/iphone/monotouch/UIKit/UIApplication.cs:31 в SmartPhoneSolution.Application.Main (string []) [0x00000] в /Users/aprdev/Projects/SmartPhoneSolution/SmartPhoneSolution/Main.cs:15 at (вызов оболочки во время выполнения) .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

Ответы [ 2 ]

2 голосов
/ 18 мая 2011

То же самое случилось со мной при переносе существующего кода 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

2 голосов
/ 14 апреля 2011

У меня была похожая проблема на прошлой неделе. Кажется, что MT 4 более агрессивен в своем GC, чем более ранние версии, и вещи, с которыми мне удавалось раньше обходиться, теперь вызывают проблемы.

Попробуйте объявить свою кнопку UIB на уровне класса, а не определять ее локально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...