Приложение iPhone InputAccessoryView не отображается на iPad - PullRequest
1 голос
/ 28 октября 2010

Я использую Monotouch для разработки приложения для iPhone.

В моем приложении только для iPhone у меня появляется InputAccessoryView всякий раз, когда пользователь выбирает текстовое поле.Вспомогательное представление предоставляет кнопки, которые помогают пользователю (отменить / повторить и т. Д.).

Он фантастически работает на симуляторе и на устройствах iPhone.

Однако, совершенно неожиданно, представление аксессуара ввода не отображается на iPad.Я не внес никаких изменений в код, касающийся представлений;Я даже откатился на версию, в которой я знаю правильно отобразил вспомогательный вид.

Мне было интересно, сталкивался ли кто-нибудь еще с таким поведением раньше / знал бы, почему это происходит?

РЕДАКТИРОВАТЬ

Я видел эточерез все моих проектов iphone, работающих на ipad.Я сделал новый проект, который содержит только 1 представление, 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 - версия 2.6 Mono.Я собираюсь попробовать обновить Mono до версии 2.8.

Я не понимаю, почему раньше это работало, а потом вдруг перестало работать?

При развертывании кода на iPad я выбираю «Перестроить все», а затем загружаю на устройство.Неважно, выберу ли я Release / Debug как сборку, оба будут давать один и тот же результат.

РЕДАКТИРОВАТЬ 2

Если я подкласс UITextField и переопределить InputAccessoryView в этом подклассе, то представление появится на iPad.Это означает, что InputAccessoryView, который переопределяется в классе View, не назначается текстовому полю на ipad.

РЕДАКТИРОВАТЬ 3 Похоже, это исправлено в iOS 4.2 с Monotouch 3.2!

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

У меня была та же проблема, когда UITextView, содержащийся в UIView, отображал панель аксессуаров на симуляторе, но не на iPhone или iPad.

Я делаю несколько странных вещей с BeginFirstResponder, чтобы разрешить касание в любом месте в большей родительской области (содержащей метку и текстовое поле) и активировать содержащееся в нем поле и подозревать, что это было связано.Я добавил код в родительский UIView, чтобы переопределить InputAccessoryView и заставить его возвращать значение из дочернего UITextView, и это исправлено.

Я подозреваю, что у Monotouch есть проблема, направившая событие на неправильный объект, и мое исправление устраненоit.

псевдокод:

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;}}
}
2 голосов
/ 04 ноября 2010

Мое первое предложение - сбросить настройки устройства в iTunes. Возможно, вы уже сделали это, но на случай, если вы этого не сделали, сначала сделайте это (поскольку это быстро и легко сделать).

Если это не помогло: чтобы определить, является ли это проблемой с Monotouch и / или iOS SDK, не могли бы вы повторить то, что вы сделали выше, используя только Cocoa Touch?

Т.е., запустите приложение на основе View в XCode, добавьте одно UITextField в Interface Builder и подключите его к контроллеру. Вот соответствующий код Objective-C, чтобы сделать это:

Переменные экземпляра в вашем контроллере (добавьте в раздел @interface в файле <controllername>.h):

IBOutlet UITextField *text;
UIView *accessory;

Подключите UITextField в Интерфейсном Разработчике к розетке text и затем добавьте следующую реализацию viewDidLoad в контроллер (раздел @implementation в файле <controllername>.m):

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

Если при этом правильно отображается синяя полоса, проблема в настройке Monotouch. Если это не так, это проблема с вашим устройством.

1 голос
/ 04 ноября 2010

Как вы показываете свой аксессуар вид?

Можете ли вы попробовать сохранить ссылку на представление?

Попробуйте и дайте мне знать, если это не удастся:

публичный класс Foo { статический трек UIView; }

А затем, когда вы создаете свое представление, вставьте его в этот глобал:

Foo.track = new MyAccessoryView ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...