哈玛林.Objective-C 库绑定 Xamarin iOS 错误



我正在绑定这个Objective-C库 - ** SPSlideTabBarController 用于我的 Xamarin iOS 应用程序。

我在 ApiDefinitions.cs 文件中进行了一些更改,并且在生成绑定项目时遇到 3 个生成错误。错误反映在生成的文件中SPSlideTabBarProtocol.g.cs

以下是错误:

1. The modifier abstract is not valid for this item

对于此行代码:

[Export ("initWithTabBarItems:")]
[CompilerGenerated]
public abstract SPSlideTabBarProtocol (SPSlideTabBarItem[] tabBarItems);

第二个错误:

2. cannot declare instance members in a static class  <--- error right on this line
[CompilerGenerated]
    public virtual SPSlideTabBarController SlideTabBarController {
        [Export ("slideTabBarController", ArgumentSemantic.Retain)]
        get {
            SPSlideTabBarController ret;
            if (IsDirectBinding) {
                ret =  Runtime.GetNSObject<SPSlideTabBarController> (global::ApiDefinition.Messaging.IntPtr_objc_msgSend (this.Handle, Selector.GetHandle ("slideTabBarController")));
            } else {
                ret =  Runtime.GetNSObject<SPSlideTabBarController> (global::ApiDefinition.Messaging.IntPtr_objc_msgSendSuper (this.SuperHandle, Selector.GetHandle ("slideTabBarController")));
            }
            return ret;
        }
    }

第三个错误:

3.cannot declare instance members in a static class
[CompilerGenerated]
    public virtual SPSlideTabBarItem SlideTabBarItem { // <--- error right on this line
        [Export ("slideTabBarItem", ArgumentSemantic.Retain)]
        get {
            SPSlideTabBarItem ret;
            if (IsDirectBinding) {
                ret =  Runtime.GetNSObject<SPSlideTabBarItem> (global::ApiDefinition.Messaging.IntPtr_objc_msgSend (this.Handle, Selector.GetHandle ("slideTabBarItem")));
            } else {
                ret =  Runtime.GetNSObject<SPSlideTabBarItem> (global::ApiDefinition.Messaging.IntPtr_objc_msgSendSuper (this.SuperHandle, Selector.GetHandle ("slideTabBarItem")));
            }
            return ret;
        }

ApiDefinition.cs 文件中的相应定义是:

1.// @protocol SPSlideTabBarProtocol <NSObject>
[Protocol, Model]
[BaseType(typeof(NSObject))]
//[Model][Protocol]
interface SPSlideTabBarProtocol
{
    // @required -(instancetype)initWithTabBarItems:(NSArray<SPSlideTabBarItem *> *)tabBarItems;
    [Abstract]
    [Export("initWithTabBarItems:")]
    IntPtr Constructor(SPSlideTabBarItem[] tabBarItems);
}
2. // @interface SPSlideTabBarItem (UIViewController)
[BaseType(typeof(UIViewController))]
[Category]
interface UIViewController_SPSlideTabBarItem
{
    // @property (nonatomic, strong) SPSlideTabBarItem * _Null_unspecified slideTabBarItem;
    [Export("slideTabBarItem", ArgumentSemantic.Strong)]
    SPSlideTabBarItem SlideTabBarItem { get; set; }
    // @property (readonly, nonatomic, strong) SPSlideTabBarController * _Nullable slideTabBarController;
    [NullAllowed, Export("slideTabBarController", ArgumentSemantic.Strong)]
    SPSlideTabBarController SlideTabBarController { get; }
}

我已经尝试了一些解决方案,但无济于事。有人可以帮助我理解这些错误吗?

谢谢。

我已经能够通过以下方式解决这些错误:

1.The modifier abstract is not valid for this item

为此,我所要做的就是从定义中删除抽象属性,如下所示:

由此:

interface SPSlideTabBarProtocol
{
// @required -(instancetype)initWithTabBarItems:
(NSArray<SPSlideTabBarItem *> *)tabBarItems;
[Abstract]
[Export("initWithTabBarItems:")]
IntPtr Constructor(SPSlideTabBarItem[] tabBarItems);

}

对此:

interface SPSlideTabBarProtocol
{
// @required -(instancetype)initWithTabBarItems:(NSArray<SPSlideTabBarItem *> *)tabBarItems;
[Export("initWithTabBarItems:")]
IntPtr Constructor(SPSlideTabBarItem[] tabBarItems);

}

对于其他两个错误,错误是由于类是静态的,但它的成员不是。因此,如果类已被定义为静态,那么我们也需要将成员定义为静态。以下是更改:

我从这里向属性添加了一个静态属性:

  [BaseType(typeof(UIViewController))]
  [Category]
  interface UIViewController_SPSlideTabBarItem
  {
// @property (nonatomic, strong) SPSlideTabBarItem * _Null_unspecified slideTabBarItem;
[Export("slideTabBarItem", ArgumentSemantic.Strong)]
SPSlideTabBarItem SlideTabBarItem { get; set; }
// @property (readonly, nonatomic, strong) SPSlideTabBarController * _Nullable slideTabBarController;
[NullAllowed, Export("slideTabBarController", ArgumentSemantic.Strong)]
SPSlideTabBarController SlideTabBarController { get; }
 }

对此:

 [BaseType(typeof(UIViewController))]
[Category]
interface UIViewController_SPSlideTabBarItem
{
    // @property (nonatomic, strong) SPSlideTabBarItem * _Null_unspecified slideTabBarItem;
    [Static] //<----static attribute added here
    [Export("slideTabBarItem", ArgumentSemantic.Strong)]
    SPSlideTabBarItem SlideTabBarItem { get; set; }
    // @property (readonly, nonatomic, strong) SPSlideTabBarController * _Nullable slideTabBarController;
    [Static] //<----static attribute added here
    [NullAllowed, Export("slideTabBarController", ArgumentSemantic.Strong)]
    SPSlideTabBarController SlideTabBarController { get; }
}

对于 2,您应该更改为:

// @interface SPSlideTabBarItem (UIViewController)
[Category]
[BaseType (typeof(UIViewController))]
interface UIViewController_SPSlideTabBarItem
{
    // @property (nonatomic, strong) SPSlideTabBarItem * _Null_unspecified slideTabBarItem;
    [Export ("slideTabBarItem")]
    SPSlideTabBarItem Get_SlideTabBarItem();
    [Export ("setslideTabBarItem:")]
    void Set_SPSlideTabBarItem(SPSlideTabBarItem value);

    // @property (readonly, nonatomic, strong) SPSlideTabBarController * _Nullable slideTabBarController;
    [Export ("slideTabBarController")]
    SPSlideTabBarController Get_SlideTabBarController()
}

这是因为 C# 仅支持扩展方法,但 ObjC 中有扩展属性。

最新更新