【问题标题】:Binding MonoTouch NSObject Categories绑定 MonoTouch NSObject 类别
【发布时间】:2012-08-25 01:14:44
【问题描述】:

如何使用MonoTouch绑定它??

#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000
@interface NSObject (SubscriptingSupport)

- (id)objectAtIndexedSubscript:(NSUInteger)idx;
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx;
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key;
- (id)objectForKeyedSubscript:(id)key;

@end
#endif

在Documentation 之后尝试了这个,但没有运气

[BaseType (typeof (NSObject)), Bind ("NSObject")]
public interface NSObject2 
{
    [Bind("objectAtIndexedSubscript:")]
    NSObject ObjectAtIndexedSubscript (uint idx);

    [Bind("setObject:atIndexedSubscript:")]
    void SetObjectAtIndexedSubscript (NSObject obj, uint idx);

    [Bind("setObject:forKeyedSubscript:")]
    void SetObjectForKeyedSubscript (NSObject obj, NSObject key);

    [Bind("objectForKeyedSubscript:")]
    NSObject ObjectForKeyedSubscript (NSObject key);
}

它会产生大量错误,例如

错误 CS0115:`DocParser.Dispose(bool)' 被标记为覆盖但 找不到合适的方法来覆盖 (CS0115)

提前致谢

亚历克斯。

【问题讨论】:

    标签: objective-c ios5 binding xamarin.ios


    【解决方案1】:

    绑定工具不支持为核心类的扩展生成存根。

    好消息是,从根本上说,工作非常简单:您必须向实例 NSObject 的对象发送消息。

    这意味着您可以手动编写代码,执行以下操作:

     void GetObjectAtIndex (NSObject target, int objectAt)
     {
         Runtime.GetNSObject (Messaging.objc_msgSend_int (target.Handle, Selector.GetHandle ("objectAtIndexedSubscript:", objectAt));
     }
    

    上面写起来可能很麻烦,所以你可以在一个虚构的类上运行生成器,然后将结果复制/粘贴到你自己的类中,该类接受参数“NSObject target”,如上所示。

    【讨论】:

      【解决方案2】:

      我认为你需要保持类名相同,只要你有一个除了MonoTouch.Foundation之外的不同命名空间:

      namespace WhateverNamespaceYouWantBesidesMonoTouch.Foundation
      {
        [BaseType (typeof (MonoTouch.Foundation.NSObject))]
        public interface NSObject
        {
          [Export("objectAtIndexedSubscript:")]
          MonoTouch.Foundation.NSObject ObjectAtIndexedSubscript (uint idx);
      
          [Export("setObject:atIndexedSubscript:")]
          void SetObjectAtIndexedSubscript (MonoTouch.Foundation.NSObject obj, uint idx);
      
          [Export("setObject:forKeyedSubscript:")]
          void SetObjectForKeyedSubscript (MonoTouch.Foundation.NSObject obj, MonoTouch.Foundation.NSObject key);
      
          [Export("objectForKeyedSubscript:")]
          MonoTouch.Foundation.NSObject ObjectForKeyedSubscript (MonoTouch.Foundation.NSObject key);
        }
      }
      

      我也不确定 [Bind] 有什么作用,你应该改用 [Export]。

      【讨论】:

      • 你好 jonathanpeppers 据我了解 Bind ("NSObject") 将所有接口代码附加到 NSObject 类,如此处所示github.com/mono/maccore/blob/master/src/foundation.cs#L3317 这是我相信的,我可能是错的,但我猜它仅当您从源代码构建时,因为在生成的代码 .g.cs 文件中,它使用我自己的命名空间并声明为 public partial class NSObject 我尝试使用 MonoTouch.Foundation 而不是我自己的命名空间,但它也失败了,因为 MonoTouch.dll NSObject它不是部分的
      • 还尝试通过将 NSObject.g.cs 上的结果代码更改为 Static (扩展方法)来扩展 NSObject 类,但它也不起作用。我正在尝试您的解决方案,现在会返回结果
      • 不,那也没用,我遇到很多这样的错误 -> Error CS0115: DocParser.Dispose(bool) is marked as an override but no suitable method found to override (CS0115)
      • 你能发布一个链接到你试图绑定的库吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多