Monotouch - 转换为xCode 4 - XIB无法正常工作

时间:2011-10-26 21:06:45

标签: c# xcode interface-builder xamarin.ios monodevelop

我有一个在IB 3.x中创建的XIB解决方案。当我在xCode 4中编辑它们并保存更改时,我的Xib文件都搞砸了并且没有显示任何内容 - 只是空白屏幕。

也许项目没有正确升级? 如果有人有任何想法,请尽快告诉我 - 我无法编辑任何XIB!

设定: 我仔细检查了MT和MD是最新的。 2.编译ios 4.x. 3.根据我的设置和解决方案,问题是100%可重现的

以下是文件的前后文件。以下是我用来解决问题的确切步骤。

由于5K限制,我无法发布整个文件但是jist是新的Xcode 4文件有完整的getter和setter。

**** ORIGINAL 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);
        }
    }
    }
}

在xCode 4中修改xib后:

// 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. 双击nib文件以在xCode 4中打开它
  3. 将圆形rect按钮拖放到View
  4. 选择保存“xxxx”
  5. 在Debug | iPhoneSimulator中运行应用程序。它正在显示视图。
  6. 停止应用
  7. 双击同胞以在xCode 4中打开它。
  8. 控制 - 从按钮拖动到.h
  9. 创建名为cmdDosomething
  10. 的商店
  11. 关闭并保存文件。
  12. 在视图的ViewDidLoad和ViewDidAppear的开头设置断点。
  13. 重新启动应用程序
  14. 单击显示视图的选项卡。 ViewDidAppear被点击了。 ViewDidLoad没有被点击。视图会显示 NOT ,标签栏上方只有一个空白区域
  15. 在标签上随机点击。所有其他观点看起来很好。 ViewDidAppear在相关视图上正常调用。
  16. 我真的很感激指点或想法。 太感谢了 WCM

1 个答案:

答案 0 :(得分:3)

我有同样的问题,并且能够找出原因和解决方案:

我在2.8之前创建的视图有一个名为view的视图的插座。当我打开头文件时,我发现XCode抱怨视图的声明是重复的名称。

由于这似乎可能是问题的根源,我采取了以下步骤:

1)删除文件所有者的出口列表中的视图出口

2)手动删除头文件中对视图的两个引用

3)将文件所有者的出口列表中的View插座直接链接到视图(我没有将连接拖到头文件中,我将其拖动到设计器区域左侧的视图中) 。如果您忘记执行此步骤,则会收到有关正在加载的nib但未发送视图插座的运行时错误。

希望这有助于您解决问题。

我忘了提到:设计师档案是正确的; MT改变了在设计器文件中识别出口的方式。