从我的问题:
Without subclassing a UIView or UIViewController: possible to catch if a subview was added?
我想知道如何从MonoTouch的答案中移植代码.它基本上用一个新方法替换一个方法,然后在没有子类化的情况下调用旧方法.是否有可能让这个指针在MonoTouch中工作?
//Makes views announce their change of superviews Method method = class_getInstanceMethod([UIView class],@selector(willMovetoSuperview:)); IMP originalImp = method_getImplementation(method); void (^block)(id,UIView*) = ^(id _self,UIView* superview) { [_self willChangeValueForKey:@"superview"]; originalImp(_self,@selector(willMovetoSuperview:),superview); [_self didChangeValueForKey:@"superview"]; }; IMP newImp = imp_implementationWithBlock((__bridge void*)block); method_setImplementation(method,newImp);
解决方法
这似乎是我们提供劫持方法的通用机制的一个很好的候选者.以下是纯C#代码的实现,您可以在此期间使用它:
[DllImport ("/usr/lib/libobjc.dylib")] extern static IntPtr class_getInstanceMethod (IntPtr classHandle,IntPtr Selector); [DllImport ("/usr/lib/libobjc.dylib")] extern static Func<IntPtr,IntPtr,IntPtr> method_getImplementation (IntPtr method); [DllImport ("/usr/lib/libobjc.dylib")] extern static IntPtr imp_implementationWithBlock (ref BlockLiteral block); [DllImport ("/usr/lib/libobjc.dylib")] extern static void method_setImplementation (IntPtr method,IntPtr imp); static Func<IntPtr,IntPtr> original_impl; void HijackWillMovetoSuperView () { var method = class_getInstanceMethod (new UIView ().ClassHandle,new Selector ("willMovetoSuperview:").Handle); original_impl = method_getImplementation (method); var block_value = new BlockLiteral (); CaptureDelegate d = MyCapture; block_value.SetupBlock (d,null); var imp = imp_implementationWithBlock (ref block_value); method_setImplementation (method,imp); } delegate void CaptureDelegate (IntPtr block,IntPtr self,IntPtr uiView); [MonopInvokeCallback (typeof (CaptureDelegate))] static void MyCapture (IntPtr block,IntPtr uiView) { Console.WriteLine ("Moving to: {0}",Runtime.GetNSObject (uiView)); original_impl (self,uiView); Console.WriteLine ("Added"); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。