2012-01-09 2 views
1

AVPlayerItem 클래스의 loadedTimeRanges 속성을 사용하여 파일의 어느 부분이 다운로드되었는지 알아야합니다. 불행히도이 속성은 MonoTouch에서 사용할 수없는 것 같습니다. MonoTouch Rosetta Stone reference에서MonoTouch & objective-c 선택기 매핑에서 AVPlayerItem의 loadedTimeRanges 속성을 사용할 수 없음

, 방법은 존재하지만 주석 :

선택기 : loadedTimeRanges
재산권 : // NSArray를 loadedTimeRanges {얻을; }

향후에 추가 될 방법을 알고 계신 분 있습니까?

: 그런 방법이라고

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

후에 : 그 동안

는, I는 I 누락 선택기 정의 xamarin doc

에 따른 목표 -C 선택기 맵핑하려고

/* 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. 

누군가 내가 알고있는 와트를 아십니까? 미리 감사드립니다!

답변

2

NSArray를 DllImport에서 반환 할 수 없으므로 반환 유형으로 IntPtr을 선언해야합니다. 더 나은

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

이이 경우에 있습니다 : 어떤 경우에 당신이 같이 DllImport를 직접 추가 할 필요가 없습니다, 사용하는 것이 이미 준비가

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

하나의 값은 다음과 같습니다

CMTime timestamp = values [0].CMTimeValue;