#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. Я не пробовал приведенный выше код, поэтому не видел панель поиска. Вам будет лучше (больше глаз), если вы зададите новый вопрос.