UISearchBar, UITableViewController и UINavigationController получили SIGSEGV при выполнении собственного кода

#ios #uinavigationcontroller #xamarin.ios #uitableview #uisearchbar

#iOS #uinavigationcontroller #xamarin.ios #uitableview #uisearchbar

Вопрос:

У меня есть простое тестовое приложение с NavigationController, которое расширяет UINavigationController

 [MonoTouch.Foundation.Register("NavigationController")]
public class NavigationController : UINavigationController
{
    public NavigationController (IntPtr handle) : base (handle)
    {

    }

    [Export ("initWithCoder:")]
    public NavigationController (NSCoder coder) : base (coder)
    {

    }

    public NavigationController (UIViewController rootViewController) : base(rootViewController)
    {

    }

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

        View.BackgroundColor = UIColor.Green;
    }
}
  

У меня также есть CustomersTableViewController, который расширяет UITableViewController (здесь источник не влияет). В методе viewDidLoad я создаю UISearchBar и добавляю его в tableHeaderView.

 public class CustomersTableViewController : UITableViewController
{
    UISearchBar _searchBar;

    public CustomersTableViewController(UITableViewStyle style) : base(style)
    {
    }

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

        _searchBar = CreateSearchBar ();
        _searchBar.SearchButtonClicked  = OnSearchBarSearchButtonClicked;

        TableView.TableHeaderView = _searchBar;

    }

    void OnSearchBarSearchButtonClicked (object sender, EventArgs e)
    {

    }

    static UISearchBar CreateSearchBar ()
    {
        UISearchBar search = new UISearchBar ();
        search.Placeholder = "Search Customers";
        search.SizeToFit ();
        search.AutocorrectionType = UITextAutocorrectionType.No;
        search.AutocapitalizationType = UITextAutocapitalizationType.None;
        return search;
    }
}
  

В Main.cs я запускаю следующий фрагмент кода. Если я создаю NavigationController с помощью кода или через xib, это то же самое.

 // The name AppDelegate is referenced in the MainWindow.xib file.
public partial class AppDelegate : UIApplicationDelegate
{
    // This method is invoked when the application has loaded its UI and its ready to run
    public override bool FinishedLaunching (UIApplication app, NSDictionary options)
    {
        // If you have defined a view, add it here:
        //window.AddSubview (navigationController.View);

        NavigationController navigationController = new NavigationController(new CustomersTableViewController(UITableViewStyle.Plain));
        window.AddSubview (navigationController.View);

        window.MakeKeyAndVisible ();

        return true;
    }
}
  

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

 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 MonoTouch.UIKit.UIApplication.Main (string[]) [0x00000] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:34
 at TestSearchBar.Application.Main (string[]) [0x00000] in /Users/lorenzo/Projects/TestSearchBar/TestSearchBar/Main.cs:13
 at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff>

Native stacktrace:

0   TestSearchBar                       0x000d1e9c mono_handle_native_sigsegv   343
1   TestSearchBar                       0x000100e0 mono_sigsegv_signal_handler   322
2   libSystem.B.dylib                   0x9373205b _sigtramp   43
3   ???                                 0xffffffff 0x0   4294967295
4   UIKit                               0x01d73227 -[UITextField canBecomeFirstResponder]   204
5   UIKit                               0x01da7226 -[UIResponder becomeFirstResponder]   171
6   UIKit                               0x01f6f961 -[UITextInteractionAssistant setFirstResponderIfNecessary]   208
7   UIKit                               0x01f725e2 -[UITextInteractionAssistant oneFingerTap:]   1676
8   UIKit                               0x01f694f2 -[UIGestureRecognizer _updateGestureWithEvent:]   730
9   UIKit                               0x01f654fe -[UIGestureRecognizer _delayedUpdateGesture]   47
10  UIKit                               0x01f6bafc _UIGestureRecognizerUpdateObserver   584
11  UIKit                               0x01f6bce1 _UIGestureRecognizerUpdateGesturesFromSendEvent   51
12  UIKit                               0x01cff32a -[UIWindow _sendGesturesForEvent:]   1292
13  UIKit                               0x01cfaca3 -[UIWindow sendEvent:]   105
14  UIKit                               0x01cddc37 -[UIApplication sendEvent:]   447
15  UIKit                               0x01ce2f2e _UIApplicationHandleEvent   7576
16  GraphicsServices                    0x04053992 PurpleEventCallback   1550
17  CoreFoundation                      0x00ea6944 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__   52
18  CoreFoundation                      0x00e06cf7 __CFRunLoopDoSource1   215
19  CoreFoundation                      0x00e03f83 __CFRunLoopRun   979
20  CoreFoundation                      0x00e03840 CFRunLoopRunSpecific   208
21  CoreFoundation                      0x00e03761 CFRunLoopRunInMode   97
22  GraphicsServices                    0x040521c4 GSEventRunModal   217
23  GraphicsServices                    0x04052289 GSEventRun   115
24  UIKit                               0x01ce6c93 UIApplicationMain   1160
25  ???                                 0x077f6764 0x0   125790052
26  ???                                 0x077f6630 0x0   125789744
27  ???                                 0x077f5f60 0x0   125788000
28  ???                                 0x077f5eac 0x0   125787820
29  ???                                 0x077f5f37 0x0   125787959
30  TestSearchBar                       0x0000fe9b mono_jit_runtime_invoke   1332
31  TestSearchBar                       0x001ee961 mono_runtime_invoke   137
32  TestSearchBar                       0x001f1048 mono_runtime_exec_main   669
33  TestSearchBar                       0x001f0432 mono_runtime_run_main   843
34  TestSearchBar                       0x000a3f9e mono_jit_exec   200
35  TestSearchBar                       0x002a3d21 main   3733
36  TestSearchBar                       0x00003179 _start   208
37  TestSearchBar                       0x000030a8 start   40

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

Есть предложения? Это ошибка MT? Я что-то пропустил? Заранее благодарю вас.

РЕДАКТИРОВАТЬ: я использую MT 4.2.2 с Mono 2.10.4. Сбой по-прежнему сохраняется и с Mono 2.10.5.

Ответ №1:

Измените свой:

    NavigationController navigationController = new NavigationController(new CustomersTableViewController(UITableViewStyle.Plain));
  

из локальной переменной (которую GC может собирать, как только она больше не используется) в поле (которое будет поддерживать ссылку до тех пор, пока существует экземпляр типа). Например.

    private NavigationController navigationController;
   ...

   navigationController = new NavigationController(new CustomersTableViewController(UITableViewStyle.Plain));
  

Обратите внимание, что:

    window.AddSubview (navigationController.View);
  

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

Комментарии:

1. Это работает! Знаете ли вы, как можно изменить ширину UISearchBar? Используя предыдущий код, панель использует общую ширину экрана устройства. Большое вам спасибо!!

2. Я не пробовал приведенный выше код, поэтому не видел панель поиска. Вам будет лучше (больше глаз), если вы зададите новый вопрос.