2

下面的 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# 表亲是什么?

4

1 回答 1

1

很多问题......这里有一些答案:

ObjectiveCinit*选择器是 .NET 构造函数。所以:

- (instancetype)initWithDocument:(PSPDFDocument *)document;

应该是这样的:

[Export ("initWithDocument:")]
IntPtr Constructor (PSPDFDocument document);

并且您的其他 C# 绑定缺少它们的[Export]属性。例如

[Export ("isInPopover")]
bool IsInPopover { get; set; }

其他问题:

<PSPDFStyleable>是一个 Objective-C 协议,它与 .NET 接口非常相似。现在,如果您不需要PSPDFStyleable,则不必绑定它。

是什么id<PSPDFBookmarkViewControllerDelegate>

那是一个实现PSPDFBookmarkViewControllerDelegate. 您通常会将 this 绑定PSPDFBookmarkViewControllerDelegateDelegate属性,并添加 aWeakDelegate以便可以使用任何NSObject实现正确选择器的选项。例如

[Export ("delegate", ArgumentSemantic.Assign)][NullAllowed]
NSObject WeakDelegate { get; set; }

[Wrap ("WeakDelegate")]
PSPDFBookmarkViewControllerDelegate Delegate { get; set; }

您需要添加Delegates=new string [] { "WeakDelegate" }到您的[BaseType]属性。Events=如果您想将委托成员转换为事件,还可以添加。例如

[BaseType (typeof (UITableViewController), Delegates=new string [] { "WeakDelegate" }, Events=new Type [] {typeof (PSPDFBookmarkViewControllerDelegate)})]

(SubclassingHooks)是一个 Objective-C 类别,与 .NET 扩展方法非常相似。这需要与现有生成器进行一些手动绑定。

最后确保阅读Xamarin 文档门户上提供的绑定文档。它不是很复杂(您的示例在很少的几行中就遇到了很多案例),但是有很多数据需要消化(如果您不太了解 Objective-C,则需要消化更多数据)。

于 2012-11-08T20:22:54.053 回答