【问题标题】:Setting delegates to "self" from a class method从类方法将委托设置为“自我”
【发布时间】:2011-07-18 04:59:27
【问题描述】:

说,我想从帮助类方法调用 UIActionSheet。我希望助手类(而不是对象)成为此操作表的代表。 所以我将 self 传递给委托人。

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"MyTitle"
                                                         delegate:self
                                                cancelButtonTitle:nil
                                           destructiveButtonTitle:@"Delete" 
                                                otherButtonTitles:nil];

我的助手类将委托方法实现为类方法,一切正常。 但是,我从编译器收到警告说,不兼容的指针,在需要 id 时发送 Class。我也试过 [self class] 并得到同样的警告。

我怎样才能避免这个警告?

【问题讨论】:

  • 在 Objective-C 中,这些被称为“类方法”,而不是“静态方法”。这可能会帮助您将来寻求帮助。 :)
  • 谢谢。我用代码切换 Objective-C 和 C#。无法避免错别字。
  • 谢谢。我用代码切换 Objective-C 和 C#。无法避免错别字。
  • 我只想说“不要这样做”。它会让任何阅读您的代码的人感到困惑。每当我认为将大量代码放入类方法中是个好主意时,我发现自己在一周后改变了主意并创建了一个 Singleton 对象。如果其他人接管了您的项目,他们将在此处发布并询问如何使用类作为委托。

标签: iphone objective-c ios class delegates


【解决方案1】:

只需将代理设置为[self self]

【讨论】:

  • 我实际上并不完全确定,但由于self 是指向将接收消息的当前对象的指针,因此将Class 对象屏蔽为self 指针以某种方式使编译器安逸。不过,这只是编译器的事情;使用self 工作正常,但编译器警告会让你发疯。
  • "谢谢。它可以工作,但它是如何工作的?" -> 这是成为一名优秀程序员的可靠标志。
【解决方案2】:

您可以通过将 self 转换为类型 id 来消除警告。

[[UIActionSheet alloc] initWithTitle:@"MyTitle"
                            delegate:(id<UIActionSheetDelegate>)self
                   cancelButtonTitle:nil
              destructiveButtonTitle:@"Delete" 
                   otherButtonTitles:nil];

这将告诉编译器将该值视为符合 UIActionSheetDelegate 协议的id

【讨论】:

  • 无论如何要在 SWIFT 中执行此操作?
【解决方案3】:

在您将对象指针传递给方法之前,您不会收到警告。它需要一个id,你给Class,这是一个typedef struct objc_class *Class;

【讨论】:

    【解决方案4】:

    我通过在类.h文件接口声明处添加来解决

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      相关资源
      最近更新 更多