Monotouch - 转换到 xCode 4 - XIB 不工作

Posted

技术标签:

【中文标题】Monotouch - 转换到 xCode 4 - XIB 不工作【英文标题】:Monotouch - tranistioning to xCode 4 - XIBs not working 【发布时间】:2011-10-26 21:06:45 【问题描述】:

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

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

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

这里是之前和之后的文件。下面是我用来产生问题的确切步骤。

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

**** 原始 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; 
    


这是我用来重现它的步骤:

    运行应用并验证相关视图是否正确显示 双击 nib 文件在 xCode 4 中打开它 将圆形矩形按钮拖放到视图上 选择保存“xxxx” 在 Debug|iPhoneSimulator 中运行应用程序。它正在显示视图。 停止应用程序 双击 sib 以在 xCode 4 中打开它。 Control-Drag 从按钮到 .h 创建一个名为 cmdDosomething 的插座 关闭并保存文件。 在视图的 ViewDidLoad 和 ViewDidAppear 开头设置断点。 重新启动应用程序 单击显示视图的选项卡。 ViewDidAppear 被击中。未命中 ViewDidLoad。视图确实出现,只有标签栏上方的空白区域 随机点击标签。所有其他视图看起来都很好。 ViewDidAppear 在相关视图上正常调用。

我真的很感激一个指针或想法。 太感谢了 WCM

【问题讨论】:

【参考方案1】:

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

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

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

1) 删除了文件所有者出口列表中的查看出口

2) 手动去掉头文件中要查看的两个引用

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

希望这能帮助您解决问题。

我忘了说:设计器文件是正确的; MT 更改了在设计器文件中标识网点的方式。

【讨论】:

这个解决方案是正确的 - 只需删除多余的视图出口,它最初是为了解决 Interface Builder 3 中的限制而创建的,但与新的简化设计器代码冲突。 MonoDevelop 2.8.2 将自动删除它。你可以在support.xamarin.com/customer/portal/questions/…找到完整的解释

以上是关于Monotouch - 转换到 xCode 4 - XIB 不工作的主要内容,如果未能解决你的问题,请参考以下文章

Monotouch 自定义 UITableViewCell xCode4

Mac 在 MonoTouch 和 XCode 中开发的系统要求

使用 Storyboard 和 Monotouch 手动将更多选项卡添加到 UITabController

尝试从 monotouch 打开故事板给我一个错误

转换/访问 XML 的数据 - monotouch (Xamarin) / C# 中的字符串

MonoTouch 4.0 使用模拟器抛出 ReflectionTypeLoadException