Я хочу ввести следующую команду в отладчик
po [[UIWindow keyWindow] _autolayoutTrace]
Как мне это сделать в Xamarin Studio?
Редактировать:
Я видел этот код Objective-C
NSLog(@"%@", [[UIWindow keyWindow] _autolayoutTrace]);
в программном изменении параметров автонастройки при изменении ориентации вместе с определением интерфейса для этого.
// for debugging auto layout.
@interface UIWindow (AutoLayoutDebug)
+(UIWindow *)keyWindow;
-(NSString *)_autolayoutTrace;
@end
Я хотел бы знать, как это можно сделать в Xamarin iOS?
using MonoTouch.ObjCRuntime;
var str = new NSString (Messaging.IntPtr_objc_msgSend (UIApplication.SharedApplication.KeyWindow.Handle, new Selector ("_autolayoutTrace").Handle));
И "str" будет содержать строку, которую вы можете использовать с Console.WriteLine
Если вы используете унифицированный 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
будет null. Таким образом, нет возможности установить точку останова, а затем вызвать этот код. Вы можете вызывать этот код только в том случае, если вы предоставляете кнопку или что-то подобное, с которой вы запускаете действие.
window
? Я получаю результат, если используюUIApplication.SharedApplication.KeyWindow.Handle
. Но я не вижу неоднозначного расположения или чего-то подобного, только след всех объектов пользовательского интерфейса.View.Window.Handle
кажется, делает то же самое. Это ожидаемый результатAutoLayoutTrace
? Возможно, я не вижу этого, потому что система уже разрешила ограничения. Мне нужно что-то вроде паузы?