【问题标题】:iPhone app InputAccessoryView isn't appearing on iPadiPhone 应用 InputAccessoryView 未出现在 iPad 上
【发布时间】:2011-05-01 20:21:20
【问题描述】:

我正在使用 Monotouch 为 iPhone 开发应用程序。

在我只有 iPhone 的应用程序中,只要用户选择文本字段,我就会出现 InputAccessoryView。附件视图提供帮助用户的按钮(撤消/重做等)。

它在模拟器和 iPhone 设备上运行良好。

但是,出乎意料的是,输入附件视图没有出现在 iPad 上。我没有对有关视图的代码进行任何更改;我什至回滚到我知道正确显示附件视图的版本。

我想知道之前是否有其他人遇到过这种行为/知道为什么会发生这种情况?

编辑

我在 ipad 上运行的 所有 iphone 项目中都看到了这个。我做了一个新项目,它只包含一个视图,一个UITextField 并覆盖了输入附件视图,但我仍然什么也没看到。

我用来测试输入视图覆盖的代码是:

public override UIView InputAccessoryView
{
   get
   {
      UIView view = new UIView(new RectangleF(0,0,320,30));
      view.BackgroundColor = UIColor.Blue;
      return view;
   }
}

没什么太复杂的,在 iPhone 上只是在键盘上方返回一个蓝条。

我已多次重新安装 Mono、MonoDevelop、Monotouch 和 iOS SDK,但均无济于事。我从商店下载的应用程序仍然显示输入附件视图,所以我开始怀疑这是否是我的 Monotouch/iOS SDK 组合的问题?我正在使用 Monotouch 3.1.3 个人版和 4.1 iOS SDK - Mono 的 2.6 版。我将尝试更新到 Mono 2.8 版。

我不明白的是为什么它以前会工作然后突然停止工作?

当我在 iPad 上部署代码时,我选择“全部重建”,然后上传到设备。如果我选择发布/调试作为构建,这并不重要,两者都会产生相同的结果。

编辑 2

如果我将 UITextField 子类化并覆盖该子类中的 InputAccessoryView,则视图会出现在 iPad 上。这意味着在 View 类中被覆盖的InputAccessoryView 没有分配给 ipad 上的 Textfield。

编辑 3 看来这已在 iOS 4.2 和 Monotouch 3.2 中得到修复!

【问题讨论】:

  • 您能否详细说明在 iPad 上部署代码时您会做什么?您是否尝试在 iPad 上运行 iPhone 应用程序(未修改)?或者您是否设置了一个新的 iPad 项目,复制了代码,然后观察到行为有所不同?您能否发布一个重现该行为的最小代码/设置?

标签: c# iphone objective-c ipad xamarin.ios


【解决方案1】:

我的第一个建议是在 iTunes 中重置设备。您可能已经这样做了,但如果您没有这样做,请先这样做(因为它既快速又容易)。

如果这没有帮助:要确定这是否是 Monotouch 和/或 iOS SDK 的问题,您能否重复上述操作,仅使用 Cocoa Touch?

即,在 XCode 中启动一个基于 View 的应用程序,在 Interface Builder 中添加一个 UITextField 并将其连接到控制器。下面是对应的 Objective-C 代码:

控制器中的实例变量(添加到<controllername>.h 文件中的@interface 部分):

IBOutlet UITextField *text;
UIView *accessory;

将 Interface Builder 中的 UITextFieldtext 插座连接起来,然后将 viewDidLoad 的以下实现添加到控制器(<controllername>.m 文件中的 @implementation 部分):

- (void)viewDidLoad {
    accessory = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 30)];
    [accessory setBackgroundColor:[UIColor blueColor]];
    [text setInputAccessoryView:accessory];
    [super viewDidLoad];
}

如果蓝条正确显示,则问题出在 Monotouch 的设置上。如果不是,那是您的设备有问题。

【讨论】:

  • 这太棒了 - 谢谢!我已经完成了,并且在 ipad 上获得了附件视图,这让我相信这是与 Monotouch 相关的问题。
  • @Luke:是的,因为在我怀疑 Monotouch(和/或 iOS 和/或 SDK)的更新引入了您所看到的错误之前,您说过它曾经可以工作。我想最好的解决方案是向 Novell 提交错误报告以及使用“空”子类的临时解决方法(如上所述)。
【解决方案2】:

我遇到了同样的问题,即 UIView 中包含的 UITextView 会在模拟器上显示附件栏,但在 iPhone 或 iPad 上不显示。

我正在使用 BeginFirstResponder 做一些奇怪的事情,以允许点击较大父区域中的任何位置(包含标签和文本字段)并激活包含的字段并怀疑这涉及到。我在父 UIView 中添加了代码来覆盖 InputAccessoryView 并让它返回来自子 UITextView 的值并修复此问题。

我怀疑 Monotouch 在将事件路由到错误对象时遇到问题,我的修复解决了它。

伪代码:

public class ParentView : UIView
{
  UILabel Label;
  MyTextView Text;

 /*Magic line here that fixed the problem */
 public override UIView InputAccessoryView {get{return Text.InputAccessoryView;}}
}

public class MyTextView : UITextView
{
  UIView Accessory;

  public override UIView InputAccessoryView {get{return Accessory;}}
}

【讨论】:

    【解决方案3】:

    你是如何展示你的附件视图的?

    您可以尝试保留对视图的引用吗?

    试试这个,如果失败请告诉我:

    公共类 Foo { 静态 UIView 轨道; }

    然后,当您创建视图时,将其粘贴到该全局视图中:

    Foo.track = new MyAccessoryView ()

    【讨论】:

    • 我将其显示如下:UIViewController 有两个 UITextFields 通过 IB 连接到它。在 UIViewController 类中,我覆盖了UIView InputAccessoryView(我正在覆盖中创建视图,如我的问题中所见)。我发现这显示了视图。我尝试保留参考,在 iPhone 上它成功了,但在 ipad 上 Foo.track 为空。所以覆盖不是在 iPad 上调用而是在 iPhone 上调用? - 忘了说,谢谢你的帮助,非常感谢:)
    • 听起来你找到了问题的根源,你的覆盖没有被调用。为什么会发生这种情况是一个谜,只有你有源头才能解开;-)
    猜你喜欢
    • 2012-10-24
    • 2013-08-08
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多