我想在调试器中输入以下命令
po [[UIWindow keyWindow] _autolayoutTrace]
我如何在Xamarin Studio中做到这一点?
修改
我看到了这个Objective-C代码
NSLog(@"%@", [[UIWindow keyWindow] _autolayoutTrace]);
<{3}}中的以及该接口的定义。
// for debugging auto layout.
@interface UIWindow (AutoLayoutDebug)
+(UIWindow *)keyWindow;
-(NSString *)_autolayoutTrace;
@end
我想知道在Xamarin iOS中如何做到这一点?
答案 0 :(得分:5)
如果您使用统一API,则miguel.de.icaza发布的解决方案不再有效,因为您获得了
`ObjCRuntime.Messaging'由于其保护级别而无法访问
必须使用P/Invoke:
using System;
using System.Runtime.InteropServices;
using Foundation;
using UIKit;
using ObjCRuntime;
public static class UIViewAutolayoutTraceExtensions
{
[DllImport(Constants.ObjectiveCLibrary, EntryPoint="objc_msgSend")]
private static extern IntPtr IntPtr_objc_msgSend (IntPtr receiver, IntPtr selector);
public static NSString AutoLayoutTrace(){
return (NSString)Runtime.GetNSObject(IntPtr_objc_msgSend(UIApplication.SharedApplication.KeyWindow.Handle, new Selector ("_autolayoutTrace").Handle));
}
public static NSString RecursiveDescription(){
return (NSString)Runtime.GetNSObject(IntPtr_objc_msgSend(UIApplication.SharedApplication.KeyWindow.Handle, new Selector ("recursiveDescription").Handle));
}
}
然后你可以像这样使用它:
Console.WriteLine(UIViewAutolayoutTraceExtensions.RecursiveDescription ());
但有一点需要注意:您只能在加载完所有内容后调用此代码。否则KeyWindow
将为空。因此,不可能设置断点然后调用此代码。如果您提供触发操作的按钮或类似按钮,则只能调用此代码。
答案 1 :(得分:2)
using MonoTouch.ObjCRuntime;
var str = new NSString (Messaging.IntPtr_objc_msgSend (UIApplication.SharedApplication.KeyWindow.Handle, new Selector ("_autolayoutTrace").Handle));
“str”将包含您可以与Console.WriteLine一起使用的字符串