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