Monotouch - переход на xCode 4 - XIB не работают - PullRequest
0 голосов
/ 27 октября 2011

У меня есть решение с XIB, созданным в IB 3.x.Когда я редактирую их в xCode 4 и сохраняю изменения, все мои файлы Xib перепутаны и ничего не показывают - только пустые экраны.

Возможно, проект не обновился правильно?Если у кого-то есть какие-либо идеи, пожалуйста, дайте мне знать как можно скорее - я не могу редактировать ни один из XIB!

Настройка: 1. Я дважды проверил, что МТ и MD обновлены.2. Компиляция для ios 4.x 3. Проблема воспроизводима на 100%, учитывая мои настройки и решение

Вот файлы до и после.После них приведены точные шаги, которые я использовал для создания проблемы.

Из-за ограничения в 5 КБ я не могу опубликовать все файлы, но суть в том, что в новых файлах Xcode 4 есть полные методы получения и установки.

**** ОРИГИНАЛЬНЫЙ КОД XCode 3.x:

// -----------------------------------------------------------------------------

//  <autogenerated>
//      This code was generated by a tool.
//      Mono Runtime Version: 4.0.30319.1
// 
//      Changes to this file may cause incorrect behavior and will be lost if 
//      the code is regenerated.
//  </autogenerated>
// ------------------------------------------------------------------------------

namespace iPhoneSolution 
{
    // Base type probably should be MonoTouch.UIKit.UIViewController or subclass
    [MonoTouch.Foundation.Register("NewTaskView")]
    public partial class NewTaskView {

    private MonoTouch.UIKit.UIView __mt_view;

    private MonoTouch.UIKit.UIButton __mt_cmdAddRecipient;

    private MonoTouch.UIKit.UIButton __mt_cmdPickDateTime;

    private MonoTouch.UIKit.UITextView __mt_txtDescription;

    private MonoTouch.UIKit.UITextField __mt_txtDueDat;

    private MonoTouch.UIKit.UITextField __mt_txtName;

    private MonoTouch.UIKit.UITextView __mt_txtRecipients;

    private MonoTouch.UIKit.UIButton __mt_cmdDoneDescription;

    private MonoTouch.UIKit.UIButton __mt_cmdSend;

    #pragma warning disable 0169
    [MonoTouch.Foundation.Connect("view")]
    private MonoTouch.UIKit.UIView view {
        get {
            this.__mt_view = ((MonoTouch.UIKit.UIView)(this.GetNativeField("view")));
            return this.__mt_view;
        }
        set {
            this.__mt_view = value;
            this.SetNativeField("view", value);
        }
    }

    [MonoTouch.Foundation.Connect("cmdAddRecipient")]
    private MonoTouch.UIKit.UIButton cmdAddRecipient {
        get {
            this.__mt_cmdAddRecipient = ((MonoTouch.UIKit.UIButton)(this.GetNativeField("cmdAddRecipient")));
            return this.__mt_cmdAddRecipient;
        }
        set {
            this.__mt_cmdAddRecipient = value;
            this.SetNativeField("cmdAddRecipient", value);
        }
    }

    [MonoTouch.Foundation.Connect("cmdPickDateTime")]
    private MonoTouch.UIKit.UIButton cmdPickDateTime {
        get {
            this.__mt_cmdPickDateTime = ((MonoTouch.UIKit.UIButton)(this.GetNativeField("cmdPickDateTime")));
            return this.__mt_cmdPickDateTime;
        }
        set {
            this.__mt_cmdPickDateTime = value;
            this.SetNativeField("cmdPickDateTime", value);
        }
    }

    [MonoTouch.Foundation.Connect("txtDescription")]
    private MonoTouch.UIKit.UITextView txtDescription {
        get {
            this.__mt_txtDescription = ((MonoTouch.UIKit.UITextView)(this.GetNativeField("txtDescription")));
            return this.__mt_txtDescription;
        }
        set {
            this.__mt_txtDescription = value;
            this.SetNativeField("txtDescription", value);
        }
    }

    [MonoTouch.Foundation.Connect("txtDueDat")]
    private MonoTouch.UIKit.UITextField txtDueDat {
        get {
            this.__mt_txtDueDat = ((MonoTouch.UIKit.UITextField)(this.GetNativeField("txtDueDat")));
            return this.__mt_txtDueDat;
        }
        set {
            this.__mt_txtDueDat = value;
            this.SetNativeField("txtDueDat", value);
        }
    }

    [MonoTouch.Foundation.Connect("txtName")]
    private MonoTouch.UIKit.UITextField txtName {
        get {
            this.__mt_txtName = ((MonoTouch.UIKit.UITextField)(this.GetNativeField("txtName")));
            return this.__mt_txtName;
        }
        set {
            this.__mt_txtName = value;
            this.SetNativeField("txtName", value);
        }
    }

    [MonoTouch.Foundation.Connect("txtRecipients")]
    private MonoTouch.UIKit.UITextView txtRecipients {
        get {
            this.__mt_txtRecipients = ((MonoTouch.UIKit.UITextView)(this.GetNativeField("txtRecipients")));
            return this.__mt_txtRecipients;
        }
        set {
            this.__mt_txtRecipients = value;
            this.SetNativeField("txtRecipients", value);
        }
    }

    [MonoTouch.Foundation.Connect("cmdDoneDescription")]
    private MonoTouch.UIKit.UIButton cmdDoneDescription {
        get {
            this.__mt_cmdDoneDescription = ((MonoTouch.UIKit.UIButton)(this.GetNativeField("cmdDoneDescription")));
            return this.__mt_cmdDoneDescription;
        }
        set {
            this.__mt_cmdDoneDescription = value;
            this.SetNativeField("cmdDoneDescription", value);
        }
    }

    [MonoTouch.Foundation.Connect("cmdSend")]
    private MonoTouch.UIKit.UIButton cmdSend {
        get {
            this.__mt_cmdSend = ((MonoTouch.UIKit.UIButton)(this.GetNativeField("cmdSend")));
            return this.__mt_cmdSend;
        }
        set {
            this.__mt_cmdSend = value;
            this.SetNativeField("cmdSend", value);
        }
    }
    }
}

После изменения xib в xCode 4:

// WARNING
//
// This file has been generated automatically by MonoDevelop to store outlets and
// actions made in the Xcode designer. If it is removed, they will be lost.
// Manual changes to this file may not be handled correctly.
//
using MonoTouch.Foundation;

namespace iPhoneSolution
{
    [Register ("NewTaskView")]
    partial class NewTaskView
    {
        [Outlet]
        MonoTouch.UIKit.UIView view { get; set; }

        [Outlet]
        MonoTouch.UIKit.UIButton cmdAddRecipient { get; set; }

        [Outlet]
        MonoTouch.UIKit.UIButton cmdPickDateTime { get; set; }

        [Outlet]
        MonoTouch.UIKit.UITextView txtDescription { get; set; }

        [Outlet]
        MonoTouch.UIKit.UITextField txtDueDat { get; set; }

        [Outlet]
        MonoTouch.UIKit.UITextField txtName { get; set; }

        [Outlet]
        MonoTouch.UIKit.UITextView txtRecipients { get; set; }

        [Outlet]
        MonoTouch.UIKit.UIButton cmdDoneDescription { get; set; }

        [Outlet]
        MonoTouch.UIKit.UIButton cmdSend { get; set; }

        [Outlet]
        MonoTouch.UIKit.UIButton cmdDoSomething { get; set; }
    }
}

Вот шаги, которые я использовал для его воспроизведения:

  1. Запустите приложение и убедитесь, что отображаемое представление правильно отображается
  2. , дважды щелкните файл пера, чтобы открыть его в xCode 4
  3. Перетащите круглую прямоугольную кнопку на представление
  4. Выберите Сохранить "xxxx"
  5. Запустите приложение в Debug | iPhoneSimulator.Он отображает вид.
  6. остановите приложение
  7. дважды щелкните по sib, чтобы открыть его в xCode 4.
  8. Control-Перетащите с кнопки на .h
  9. Создание выхода с именем cmdDosomething
  10. Закройте и сохраните файл.
  11. Установите точки останова в начале ViewDidLoad и ViewDidAppear для представления.
  12. Перезапустите приложение
  13. Нажмите на вкладку, которая отображает вид.ViewDidAppear ударил.ViewDidLoad НЕ ударил.Появится представление NOT , только пустая белая область над панелью вкладок
  14. Случайно щелкните по вкладкам.Все остальные виды отображаются нормально.ViewDidAppear обычно вызывается для рассматриваемого представления.

Я был бы очень признателен за указатели или идеи.Спасибо миллион WCM

1 Ответ

3 голосов
/ 27 октября 2011

У меня была точно такая же проблема, и я смог выяснить причину и решение:

Мои представления, созданные до версии 2.8, имели выход для представления, называемого представлением.Открыв файл заголовка, я обнаружил, что XCode жалуется на то, что объявление для представления является дублирующим именем.

Так как это может быть причиной проблемы, я предпринял следующие шаги:

1) Удален выход розетки в списке выходов владельца файла

2) Вручную удалены две ссылки для просмотра в файле заголовка

3) Связан выход розетки всписок выходов владельца файла непосредственно в представление (я не перетащил соединение в файл заголовка, я перетащил его в представление, которое находится слева от области конструктора).Если вы забудете выполнить этот шаг, вы получите сообщение об ошибке загрузки загружаемого пера, но вывод представления не будет отправлен.

Надеюсь, это поможет вам решить проблему.

Я забыл упомянуть: файл конструктора правильный;MT изменил способ идентификации торговых точек в файле конструктора.

...