下面的ObjectiveC代码如何转换为MonoTouch?
@interface PSPDFBookmarkViewController : UITableViewController <PSPDFStyleable>
- (instancetype)initWithDocument:(PSPDFDocument *)document;
@property (nonatomic, weak) id<PSPDFBookmarkViewControllerDelegate> delegate;
@property (nonatomic, assign) BOOL isInPopover;
@end
instancetype
这件事(这是什么?)id<PSPDFBookmarkViewControllerDelegate>
。PSPDFStyleable
?这就是我认为的结果:
[BaseType(typeof(UITableViewController)]
interface PSPDFBookmarkViewController
{
void InitWithDocument(PSPDFDocument document);
[NullAllowed]
PSPDFBookmarkViewControllerDelegate Delegate { get; set; }
bool IsInPopover { get; set; }
}
这个界面怎么样?
@interface PSPDFBookmarkViewController (SubclassingHooks)
- (void)createBarButtonItems;
@end
什么是(SubclassingHooks)
关于什么是它的C#表兄?
答案 0 :(得分:1)
很多问题......这里有几个答案:
ObjectiveC init*
选择器是.NET构造函数。所以:
- (instancetype)initWithDocument:(PSPDFDocument *)document;
应该是:
[Export ("initWithDocument:")]
IntPtr Constructor (PSPDFDocument document);
并且您的其他C#绑定缺少其[Export]
属性。 E.g。
[Export ("isInPopover")]
bool IsInPopover { get; set; }
其他问题:
<PSPDFStyleable>
是一种Objective-C协议,与.NET接口非常相似。现在,如果您不需要PSPDFStyleable
,那么您不必绑定它。
什么是
id<PSPDFBookmarkViewControllerDelegate>
。
这是一个实现PSPDFBookmarkViewControllerDelegate
的实例。您通常会将此PSPDFBookmarkViewControllerDelegate
绑定为Delegate
属性,并添加WeakDelegate
,以便可以使用任何实现右选择器的NSObject
。 E.g。
[Export ("delegate", ArgumentSemantic.Assign)][NullAllowed]
NSObject WeakDelegate { get; set; }
[Wrap ("WeakDelegate")]
PSPDFBookmarkViewControllerDelegate Delegate { get; set; }
您需要将Delegates=new string [] { "WeakDelegate" }
添加到[BaseType]
属性中。如果要将委托成员转换为事件,还要添加Events=
。 E.g。
[BaseType (typeof (UITableViewController), Delegates=new string [] { "WeakDelegate" }, Events=new Type [] {typeof (PSPDFBookmarkViewControllerDelegate)})]
(SubclassingHooks)
是Objective-C类,与.NET扩展方法非常相似。这需要与现有生成器进行一些手动绑定。
最后,请务必阅读Xamarin文档门户网站上提供的binding documents。它不是很复杂(你的样本很少会出现很多行),但是有很多数据需要消化(如果你不太了解Objective-C,那就更多了。)