UISearchBar、UITableViewController 和 UINavigationController,在执行本机代码时得到一个 SIGSEGV
Posted
技术标签:
【中文标题】UISearchBar、UITableViewController 和 UINavigationController,在执行本机代码时得到一个 SIGSEGV【英文标题】:UISearchBar, UITableViewController and UINavigationController, Got a SIGSEGV while executing native code 【发布时间】:2011-09-29 13:41:09 【问题描述】:我有一个带有扩展 UINavigationController 的 NavigationController 的简单测试应用程序
[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;
我还有一个扩展 UITableViewController 的 CustomersTableViewController(这里的 Source 没有影响)。在 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 中,我运行以下 sn-p 代码。如果我通过代码或通过xib创建navigationController,是一样的。
// 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错误吗?我错过了什么吗?提前谢谢你。
编辑: 我正在使用 Mono 2.10.4 运行 MT 4.2.2。 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);
只会保留对 View 的引用,而不是对其父级的引用(常见错误)。
【讨论】:
有效!你知道如何修改 UISearchBar 的宽度吗?使用前面的代码,栏使用屏幕设备的总宽度。非常感谢!! 我没有尝试上面的代码所以我没有看到搜索栏。通过提出一个新问题,你会得到更好的服务(更多的眼睛)。以上是关于UISearchBar、UITableViewController 和 UINavigationController,在执行本机代码时得到一个 SIGSEGV的主要内容,如果未能解决你的问题,请参考以下文章
UISearchBar becomeFirstResponder 返回 0,但对 UISearchBar 有有效引用