我正在考虑编写一些辅助函数,以便更容易地对我的iPhone NIB中的UI元素进行简单的更改.主要是 - 我想通过Interface Builder中的Name访问UILabel或其他元素.这可能吗?有更聪明的方法吗?
说我想制作一个显示"Hello World"的超级简单的iPhone应用程序.我启动一个新项目,然后打开NIB并将UILabel拖到我的视图中,并为其命名为'LblMain'.现在,假设我已经包含了我的方便帮助函数,我想为标签分配一些新的文本,如下所示:
[helper setText:@"Hello World" forLabel:@"LblMain"];
Run Code Online (Sandbox Code Playgroud)
-要么-
UILabel *ObjTmp = [helper getUILabel:@"LblMain"];
ObjTemp.text = @"Hello World";
Run Code Online (Sandbox Code Playgroud)
现在 - 诀窍是我没有添加:
IBoutlet UILabel *ObjLblMain;
Run Code Online (Sandbox Code Playgroud)
.h文件中的任何地方 - 我只是动态访问该标签 - 这不是很好吗?!
现在,对于简单的应用程序,要添加更多标签或图像,我可以将它们拖到我的NIB中,在该元素的检查器窗口中为它们分配名称,然后立即在代码中访问它们,而不会在.h中添加它们的口吃和麻烦文件.
我有一个基于nib的表视图单元格,我在Interface builder中创建.我设置了FooTableViewCell从中扩展的表视图单元格的类UITableViewCell.
在FooTableViewCell我覆盖这样的init方法:
-(id)init{
if ((self = [super init])){
// My init code here
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
我现在希望在实例化时调用它.但是会显示表视图,但从不调用该方法.
我可以解决这个问题,但我想完全理解它,对我而言,如果没有init调用方法,对象是如何生存的还不清楚.
我是iOS开发的新手.我已经阅读了一些我在网上找到的源代码,其中很多都没有包含一个nib文件.所有视图似乎都是从代码中手动绘制的.
拥有/没有nib文件有什么好处?他们为什么选择从代码创建所有内容,而不是像图形板或*.xib文件那样可视化的内容?
我已经搜索了很多,并通过几本教科书进行了挖掘,但我真正欣赏的是在iOS应用程序中定义UIView子类的最佳实践的简单解释.
我不需要超级具体的说明 - 我更希望找到一个快速参考指南,解释在每种可用方法中应该使用哪种代码.
使用MonoTouch,我正在尝试制作自定义视图,因此我可以在屏幕中多次重复使用此视图.(这是一堆标签和按钮)阅读完这篇文章的答案后: 如何将自定义视图添加到monotouch中的XIB文件定义视图 我必须要接近,但这似乎只允许我添加自定义视图,在myCustomView.CS中定义,但我正在寻找的是一种使用单独的.XIB在界面构建器中设计我的自定义视图并仅使用相应的cs文件来添加逻辑的方法.如果我尝试使用相同的名称创建一个XIB,内容将不会显示.
以下步骤:
在MyCustomView.CS我放了[Register("MyCustomView")].
我实现了构造函数 public MyView(IntPtr handle) : base(handle) {}
在Interface Builder中打开ViewController.XIB,添加一个UIView并将其类设置为MyCustomView.
当我运行此代码时,我看到新添加的UIView,但不是视图内部的元素,即MyCustomView.XIB的内容
如果我在MyCustomView.CS的代码中添加了一些内容,this.Backgroundcolor = UIColor.Blue;就会显示,但是添加到.XIB的任何元素都没有.如何告诉Monotouch显示MyCustomView.XIB中定义的所有内容?
在Objective-C示例中,我看到类似"initWithNib"的内容不幸的是,Monoouch api中没有记录"LoadNib"部分,但这听起来像我应该做的事情,但是如何以及在哪里?
我试图弄清楚如何使用xib文件创建自定义视图.在这个问题中,使用了下一个方法.
NSBundle.mainBundle().loadNibNamed("CardView", owner: nil, options: nil)[0] as! UIView
Run Code Online (Sandbox Code Playgroud)
Cocoa有相同的方法,但是,这个方法已经在swift 3中更改为loadNibNamed(_:owner:topLevelObjects :),它返回 Bool,而之前的代码生成"Type Bool没有下标成员"错误,这很明显,因为返回类型是Bool.
所以,我的问题是如何从Swift 3中的xib文件加载视图
我即将结束我的第一个iPhone应用程序,并想通过Leaks Performance Tool运行它.在修复了一个明显的一个之后,我剩下的唯一一个是Nib充当通过loadNibNamed加载的表头视图(我在这里遵循Recipes演示).
- (void)viewDidLoad {
[super viewDidLoad];
if (self.tableHeaderView == nil) {
[[NSBundle mainBundle] loadNibNamed:@"TableHeaderView" owner:self options:nil];
self.tableView.tableHeaderView = self.tableHeaderView;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在dealloc中:
- (void)dealloc {
[tableHeaderView release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
Instruments告诉我,我正在泄漏256个字节,其中2个泄漏源自loadNibNamed.tableHeaderView是Nib中唯一的顶级对象(我在调试器中验证过).有什么我忘记发布的东西吗?我误解了乐器告诉我的内容吗?这是错的吗?OS是否会在以后清理?
我已经问过如何让自定义视图重复自己分成几个单独的副本,并告诉我应该使用NSNib或NSViewController.我在nib文件中有一个自定义视图,每当用户单击一个按钮时,我想要显示一个新的nib视图副本,同时仍然在屏幕上的其他位置维护前一个,同时运行多达十个单独的视图.由于这些中的每一个在出现之前都需要一些用户输入,我认为它们必须是每个单独的对象或某些东西,以使它们不同并且不会相互干扰.
我可以使用第一个视图
NSNib *nib = [[NSNib alloc] initWithNibNamed:@"IndividualTimers" bundle:nil];
[nib instantiateNibWithOwner:self topLevelObjects:nil];
Run Code Online (Sandbox Code Playgroud)
但是,每次按下按钮时,只会重新启动相同的视图,我可以看出两个视图已合并到该视图中,因为显示在其上的计时器开始滴答速度的两倍,但它们应该在两个不同的实例中独立显示的观点.
有人告诉我应该使用设置不同文件的所有者.
到目前为止,人们一直很有帮助,但不是很具体.我不知道我应该设置什么文件的所有者,如何以编程方式创建一个新对象来保存加载的笔尖的每个实例(如果这甚至是如何完成),或者我是否需要为每个加载单独的对象.
基本上,我想知道如何获取一个nib文件,并将其用作模板,最多可以加载十次,而每个(最多)十个视图同时运行,但是独立运行.
我非常感谢您提供的任何具体帮助,因为这是我在Xcode编程时遇到的最大问题.我被困了几个星期.谢谢你的帮助.
我是一位经验丰富的C/C++ Windows开发人员,编写我的第一个真正的iOS应用程序.由于我不必担心向后兼容性,所以我决定跳入并在XCode 4.3中使用新的Storyboard功能.我所发现的是,虽然故事板承诺在您的应用程序中布置所有屏幕,包括segues和手势,而无需编写任何代码,但实际情况是,除了最简单的程序之外的任何其他程序在运行时都不起作用他们,通常会毫不客气地失败,并提供非常无益的错误信息.更糟糕的是,你无法单步执行代码来查看错误,因为没有代码.
所以我的问题是:如果没有Interface Builder和Nibs以及Storyboard,那么一个新的iOS开发人员应该如本文所建议的那样开发吗?
我有一个特殊的例子UICollectionViewCell,我想实例自己,并加入一个例子UICollectionView。为了使其正常工作,UICollectionViewCell实例需要.reuseIdentifier设置其属性。
通常,描述该单元格的类或Nib已向收集视图注册,并且收集视图.reuseIdentifier使用以下方法实例化了已设置的单元格:
- registerClass:forCellWithReuseIdentifier:
- registerNib:forCellWithReuseIdentifier:
Run Code Online (Sandbox Code Playgroud)
但是,由于我是在集合视图之外构造此单元格的,因此这些不适用于。
当我自己创建单元格时,似乎没有办法设置它.reuseIdentifier(因为它是只读属性,并且没有init...初始化它的方法)。
如果.reuseIdentifier没有设置,则UICollectionView抛出时添加的细胞异常。此行为不同于UITableView,后者的重用标识符是可选的。
设置集合视图单元格的重用标识符的一种简单的解决方法是将其嵌入.xib文件中并使用该Identifier框,然后使用以下命令创建该单元格的实例
[NSBundle.mainBundle loadNibNamed:@"MyCellName" owner:self options:nil][0];
Run Code Online (Sandbox Code Playgroud)
然后,我可以通过上述指示UICollectionViewCell,一切正常。
...但是这似乎是一个愚蠢而随意的循环。还有其他方法可以在不使用.xib-wrapper绕行的情况下在单元实例上设置此属性吗?
更新:Apple文档说明:
为了简化代码的创建过程,集合视图要求您始终使视图出队,而不是在代码中显式创建视图。
...这实际上是不正确的,因为它不需要这样做(即,只要以某种方式设置了它们的标识符(例如从a加载.xib),外部实例化的单元就可以正常工作,而且它也不会“简化在我的特定用例中创建代码的过程(而不是需要一个额外的文件;更进一步的是,要求集合视图创建这几个复杂的一次性对象是很麻烦的)。
但是以上似乎确实暗示了对这个问题的答案是否定的:故意创建一个可用的单元格是“困难的”,除非通过使收集视图将其出队。
nib ×10
cocoa ×3
objective-c ×3
xib ×3
ios ×2
iphone ×2
view ×2
ios5 ×1
memory-leaks ×1
nsview ×1
storyboard ×1
swift3 ×1
uistoryboard ×1
uiview ×1
xamarin.ios ×1
xcode ×1
xcode4.3 ×1