【问题标题】:iOS Dev via Xcode: UIView & UITextView/UIPickerView - Cannot Assign Delegate?通过 Xcode 进行 iOS 开发:UIView 和 UITextView/UIPickerView - 无法分配委托?
【发布时间】:2011-09-01 18:03:41
【问题描述】:

直到昨晚更新 Xcode,这一切都很好(尽管可能是靠运气!)。

在分配委托时,我的 UITextViews、Fields 和 UIPickerViews 现在出现错误:

[m_textField setDelegate:GAMESTATE->glView.self];

m_textField 被定义为 UITextField*。 glView 被定义为 UIView*。为了简单起见,我对整个应用程序只使用一个 UIView(也可能是一个问题)。我只需要访问应用程序中的几个基本操作即可从用户那里获取简单的文本信息。现在我得到了错误:

Cannot initialize a parameter of type 'id<UITextFieldDelegate>' with an rvalue of type 'UIView*'

就像我说的,我可能一开始就做错了什么,而且只能靠纯粹的愚蠢运气!如果有帮助,我已经将我的 UIView 子类化为 Accelerometer Delegate,如下所示:

@interface GLView : UIView <UIAccelerometerDelegate>

任何帮助、建议或提示将不胜感激。今天早上我偶然翻阅了一些书,并复习了几个 Apple 文档,但似乎不可能快速解决。我不反对重构我从用户那里获取输入的方式,我可以只用一只手到达那里。

【问题讨论】:

  • 我不确定他们的情况。什么是游戏状态?为什么你在 glView 上调用 .self。如果您发布更多代码或应用程序结构的大纲,我认为我们可以提供更多帮助。您要使用的委托是什么对象?
  • GAMESTATE 是我使用的全局单例 - 我必须承认,传递代表的方式非常糟糕。现在我看到了 Nekto 的以下建议对我来说更有意义。我一直在绕过像这样的 iOS 特定操作的正确实现,但从现在开始我真的需要正确地做到这一点。让我看看这能不能解决问题……

标签: iphone xcode uiview delegates uitextview


【解决方案1】:

例如,您应该创建将委托的NSObject

  1. 对于UITextViewUITextViewDelegate
  2. 对于UIPickerViewUIPickerViewDelegate

您的类声明应如下所示:

@interface MyViewDelegator:NSObject<UITextViewDelegate, UIPickerViewDelegate>

然后你应该分配+初始化它并将它设置为你的文本/选择器视图的委托:

MyViewDelegator *delegator = [[MyViewDelegator alloc] init];
[m_textField setDelegate:delegator];

不要忘记在MyViewDelegator 中实现适当的方法,这些方法对于协议来说不是可选的。

【讨论】:

  • Nekto,将这些 NSObject 中的一个作为各自视图代表的子类(在本例中为选取器/文本)PER 输入字段是一个好主意还是坏主意?换句话说,如果我在屏幕上有 4 个 UITextView 对象,我应该每个都有一个 MyViewDelegator,还是所有四个都应该绑定到一个 ViewDelegator?如果一个屏幕上有 4 个 UITextViews,然后在游戏后期在一个屏幕上有另外 8 个 - 相同的处理方式,还是不同的处理方式?
  • 请记住,这不是针对应用程序的——它完全是 OpenGLES 3D 游戏,只有极少的 UIKit 输入。我不知道这是否会改变最佳做法......
  • 更新:我已经正确地实现了它(我认为)......但我仍然得到完全相同的错误。我有一个新类,MyViewDelegator,就像你建议的那样,我实例化它,然后尝试将它分配给 setDelegate,但没有任何乐趣 - 同样的错误。
  • 我认为一个委托人就可以了。但是你应该这样做,因为它对你来说更方便。代码行数将等于这两个决定。尝试使用一个对象委托器,例如,用于两个文本字段和其他 - 创建单独的委托器 (one2one)。你会明白什么更适合你的情况。
  • 是的,这很有意义,Nekto,感谢您的提示!我很高兴地报告(也很尴尬!)这是一个白痴的错误造成的混乱。我仍然无法解释我最初的观点不起作用,但是您的解决方案确实可以使用包装器来解决问题。我试图将 UITextView 分配给 UITextField :) 哎呀!再次感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 2013-12-25
相关资源
最近更新 更多