СвойствоloadedTimeRanges объекта AVPlayerItem недоступно при сопоставлении селекторов MonoTouch и target-c - PullRequest
1 голос
/ 09 января 2012

Мне нужно использовать свойствоloadedTimeRanges класса AVPlayerItem, чтобы узнать, какая часть файла была загружена.К сожалению, это свойство, по-видимому, недоступно в MonoTouch.

В MonoTouch Rosetta Stone ссылка , метод присутствует, но прокомментирован:

Селектор :loadedTimeRanges
Свойство: // NSArrayloadedTimeRanges {get;}

Кто-нибудь знает, будет ли метод добавлен в будущем?

В то же время я пытался отобразить селектор target-c в соответствии с xamarin doc

Я определил отсутствующий селектор:

[System.Runtime.InteropServices.DllImport(MonoTouch.Constants.ObjectiveCLibrary, EntryPoint="objc_msgSend")]
    static extern NSArray nsarray_objc_msgSend (
    IntPtr target, IntPtr selector);

И после этого вызвал такой метод:

/* Call loadedTimeRanges selector on AVPlayerItem */
AVPlayerItem target = m_playerItem;
MonoTouch.ObjCRuntime.Selector selector = new MonoTouch.ObjCRuntime.Selector ("loadedTimeRanges");
NSArray loadedTimeRanges = nsarray_objc_msgSend(target.Handle, selector.Handle);


/* Convert the returned value as CMTimeRange */
IntPtr intPtr = loadedTimeRanges.ValueAt(0);
System.Runtime.InteropServices.GCHandle handle = System.Runtime.InteropServices.GCHandle.FromIntPtr(intPtr);
NSValue v = (NSValue)handle.Target;
MonoTouch.CoreMedia.CMTimeRange timeRange = v.CMTimeRangeValue;

Но я получаю следующую ошибку при вызове моего селектора:

Unhandled Exception: System.Runtime.InteropServices.MarshalDirectiveException: Type MonoTouch.Foundation.NSObject which is passed to unmanaged code must have a StructLayout attribute.

Кто-нибудь знает, почему я скучаю?Заранее спасибо!

1 Ответ

2 голосов
/ 09 января 2012

Вы не можете вернуть NSArray из DllImport, вам нужно объявить IntPtr как тип возвращаемого значения.В любом случае вам не нужно добавлять DllImport самостоятельно, он уже готов к использованию:

IntPtr ptr = MonoTouch.ObjCRuntime.Messaging.IntPtr_objc_msgSend (target.Handle, selector.Handle);
NSArray loadedTimesRange = new NSArray (ptr);

В этом случае это даже лучше:

NSValue [] values = NSArray.ArrayFromHandle<NSValue> (ptr);

Одно значениебудет:

CMTime timestamp = values [0].CMTimeValue;
...