我尝试覆盖UIViewController子类的默认initWithNibName指定初始化程序,如下所示:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
// Custom initialization
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
我还在头文件中包含了它的定义.但是,当我的Application Delegate nib加载viewcontroller时,不调用初始化程序,只调用-viewDidLoad.
那个nib magic如何实例化我的视图控制器呢?为什么所有的XCode模板都说明了
//指定的初始化程序.如果以编程方式创建控制器并希望执行不适合viewDidLoad的自定义,则覆盖.
它是否正确当从另一个nib加载viewcontroller时,我的initWithNibName没有被调用?
model-view-controller objective-c interface-builder uikit nib
我有一个UIView子类,我想从NIB文件中实例化.我一直在使用这种方法来做到这一点:
UINib *nib = [UINib nibWithNibName:@"SSNodeToolsView" bundle:[NSBundle mainBundle]];
self = [[[nib instantiateWithOwner:self options:nil] objectAtIndex:0] retain];
Run Code Online (Sandbox Code Playgroud)
......实际上,这会正确地创建对象并将所有内容联系起来.但是,该对象立即失去对其委托的访问权限.委托以通常的方式声明:
id delegate
@property (nonatomic, assign) id delegate
@synthesize delegate
Run Code Online (Sandbox Code Playgroud)
...等等.但是,当对象从其nib加载时,委托会立即变为null并忽略任何为其赋值的尝试.奇怪的是,这不会导致崩溃.谁能告诉我为什么会这样?我更喜欢使用nib加载方法,因为我的应用程序的这些元素很可能经常重新设计,使用笔尖最容易.
-灰
我开发了一款iPhone应用程序.现在我想在iPad上做.为此,我必须创建新的.XIB文件并链接到他的类.
我不知道如何在xcode4中创建一个新的.xib.有人能帮帮我吗?
现在,为了解决这个问题,我使用.XIB创建一个新文件,删除.m和.h并将.XIB与我的类链接.
比你.
我已经问过如何让自定义视图重复自己分成几个单独的副本,并告诉我应该使用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开发人员应该如本文所建议的那样开发吗?
我刚刚完成了Apple的一个示例应用程序的完全重写[1],我将在GitHub上根据BSD许可证发布我的代码作为源代码.
将BSD许可证文本添加到.h和.m文件很简单,我可以将版权信息添加到我将包含的.png资产中,但我很难过如何将必要的许可证信息添加到xib文件.XCode在编辑后重新生成文件,因此手动添加到xml注释的任何内容都将被删除.
我想将这个许可证添加到nib文件中以保证完整性,但我并没有挂断它 - 所以有人可以提供任何建议吗?
[1]该应用程序是AccelerometerGraph,重写包括在单独的图表上显示每个加速度计通道,提供额外的信号输入(正弦,步进和脉冲)以及额外的滤波器(巴特沃斯一阶和二阶低高和带通).
我有一个特殊的例子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),外部实例化的单元就可以正常工作,而且它也不会“简化在我的特定用例中创建代码的过程(而不是需要一个额外的文件;更进一步的是,要求集合视图创建这几个复杂的一次性对象是很麻烦的)。
但是以上似乎确实暗示了对这个问题的答案是否定的:故意创建一个可用的单元格是“困难的”,除非通过使收集视图将其出队。
之前已经问过这个问题,我已经查看了所有其他stackoverflow主题的答案,但我无法解决问题.
我的应用程序在所有平台的模拟器中工作正常,但是当我在我的设备上运行应用程序时,我得到错误代码:无法加载从标识符"com.bundle"的包中的nib引用的"image.png"图像.标识符".

我的所有图片都是.PNG文件,我使用了商店将它们插入到imageView中.
程序:Xcode 5
真的需要你的帮助!我已经完成了解决这个问题的所有可能的帖子,但似乎没有任何效果.
所以我使用.xib文件在ProfileFoldingCellView.swift中创建一个子视图,它完全有效,直到我尝试在同一个类中添加一个IBOutlet.这是代码:
import Foundation
import UIKit
class ProfileFoldingCellView: UIView {
@IBOutlet var mainLabel: UILabel!
public var cellIndex: Int = 0
init(index: Int) {
super.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
cellIndex = index
print("Index: \(cellIndex)")
setupContentView()
}
func setupContentView() {
let contentView = UINib(nibName: "ProfileFoldingCellView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView
contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
addSubview(contentView)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupContentView()
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,标签IBOutlet的创建没有任何问题,并且没有其他过时或未使用的插件漫游.
我还确保将ProfileFoldingCellView.swift设置为文件所有者的类.
一切都运行良好,直到我连接插座!然后我收到这个错误:
相信我,我已经尝试了一切.我可能已经重新创建了一百万次,没有任何工作.任何帮助将不胜感激!
我读了一些与同一个问题有关的答案,但我想问一些具体的问题.如果你有一个巨大的项目,想象一个庞大的社交网络,即使你将你的UIViewControllers逻辑分离成单独的UIStoryBoards,它似乎仍然会减慢这个过程.每当你查看任何故事板时,需要一段时间来渲染所有这些UIViewControllers,这似乎是一个巨大的痛苦处理.
现在,对于大型项目,您会选择Nib文件还是坚持下去UIStoryBoards?