我有一个小的xib文件UIView,它包含一些标签.现在,我正在尝试将其加载UIView到现有文件中UIViewController,并更改其中一个标签文本.我想这样做的原因是,UIView将重复使用不同的标签文本,所以我想制作一个自定义类并从xib加载它将是最好的方法.
我已经尝试了几种加载它的方法,并且我已经在我的viewcontroller上成功显示了它.问题是,一旦我尝试IBOutlet在Interface Builder中实际链接并访问它,我的应用程序崩溃了.
我创建了一个自定义UIView类,如下所示:
CoverPanel.h
@interface CoverPanel : UIView {
IBOutlet UILabel *headline;
}
@property (nonatomic, retain) IBOutlet UILabel *headline;
@end
Run Code Online (Sandbox Code Playgroud)
CoverPanel.m
@implementation CoverPanel
@synthesize headline;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// Initialization code.
//
self = [[[NSBundle mainBundle] loadNibNamed:@"CoverPanel" owner:self options:nil] objectAtIndex:0];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
在CoverPanel.xib,我已经链接UILabel到标题出口.在我的viewcontroller中,这是我如何创建CoverPanel实例,这就是它崩溃的地方:
CoverPanel *panelView = [[CoverPanel alloc] initWithFrame:CGRectMake(0,0,300,100)];
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.它显示与UIView.xib中的布局完全相同.但是一旦我尝试改变 …
我一直在努力解决这个问题,我似乎无法自己解决这个问题.
情况就是这样:我想拥有一个基于Nib的自定义视图,它有自己的ViewController.然后我想将此视图添加到窗口中.因此,窗口应包含我的自定义视图.
所以我开始创建一个非常简单的例子:
NSViewController(从而导致nib与.h和.m文件一起创建.创建的.h,.m和.xib文件的名称FaceViewController用于测试目的,它应该只显示现在的文字.NSViewController.xib在InterfaceBuilder中打开并添加一个多行文本组件并将其放在自定义视图中,该视图已在xib文件中.我让文本跨越整个视图.MyDocument.xib我还添加一个Custom View占位符,应该用我的自定义FaceView替换.从这个起点开始,我试图在我的MyDocument.xib失败中包含创建的View + ViewController 以及应该显示我的文本的区域仍然是空的(就像底层窗口的背景一样).
所以我的问题确实是我需要做的,所以我的FaceView被加载到我放置的自定义视图中MyDocument.xib.以下是一些我不清楚的事情:
NSView因此我想将其更改为我的FaceView但视图不作为类存在但在xib中的InterfaceBuilder中定义,我是否需要将此设置为除此之外的其他内容NSView?FaceViewController代码或是否足以将其拖入我的两个.xibs中的任何一个?我真的认为创建一个这样的自定义视图将是一块蛋糕,但到目前为止,结果恰恰相反,所以任何帮助都将非常感激.
我有一个类似的问题可可-基于视图的NSTableView的,使用在多个表中一个单元,通过放大
苹果自己的文档进行makeViewWithIdentifier:owner:
"通常,标识符与Interface Builder中的外部NIB相关联,表视图将自动使用提供的所有者实例化NIB."
这似乎意味着你应该能够NSTableCellView将nib 存储在包含nib的单独nib中NSTableView.然而,在我的实验中,我只能获得包含在tableview中的单元格,我正在调用它.即,如果我将我的单元格剪切并粘贴到新的.xib文件中,则tableview将无法再找到它.我做错了什么,或者这实际上是不可能的,我在某种程度上误读了Apple的文档?
我无法让核心数据支持的NSArrayController在我的代码中正常工作.以下是我的代码:
pageArrayController = [[NSArrayController alloc] initWithContent:nil];
[pageArrayController setManagedObjectContext:[self managedObjectContext]];
[pageArrayController setEntityName:@"Page"];
[pageArrayController setAvoidsEmptySelection:YES];
[pageArrayController setPreservesSelection:YES];
[pageArrayController setSelectsInsertedObjects:YES];
[pageArrayController setClearsFilterPredicateOnInsertion:YES];
[pageArrayController setEditable:YES];
[pageArrayController setAutomaticallyPreparesContent:YES];
[pageArrayController setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"index" ascending:YES]]];
BOOL result = [pageArrayController setSelectionIndex:0];
Run Code Online (Sandbox Code Playgroud)
当我尝试调用setSelectionIndex:时,它返回YES,表示选择已成功更改.但是,对pageArrayController对象的任何后续getSelectionIndex调用都返回NSNotFound.
我不明白的是,如果我将NSArrayController放入NIB,并允许NIB文件执行初始化(在Interface Builder中具有所有相同的属性),NSArrayController正常工作.
为什么行为存在差异?NIB文件是否以特殊方式初始化这些类型的对象?我的NSArrayController初始化是不正确的?
任何帮助表示赞赏.谢谢.
我对基于Nib的UIViewControllers中发生的事情感到有点困惑.生成UIViewController子类时,模板在viewDidUnload方法中包含非常具体的注释:
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
Run Code Online (Sandbox Code Playgroud)
这适用于哪些子视图?
viewDidLoad?(我会说是的)initWithNibName?(我会说不)如果我像这样使用视图控制器:
MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];
[controller release];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我想这没有多大关系是否持有到子视图引用实例变量被释放viewDidUnload或dealloc因为dealloc应该得到尽快视图控制器从堆栈中弹出,所以我还不如做苹果所谓的说,释放实例变量viewDidUnload而不是dealloc.
但是假设我用作MyViewController可以多次推送的实例变量:
if(self.myViewController == nil) {
self.myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
}
//Change some state which should be reflected in the view
self.myViewController.someProperty = someValue; …Run Code Online (Sandbox Code Playgroud) 我有一个基于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调用方法,对象是如何生存的还不清楚.
有没有办法将NIB文件转换为XIB文件,以便我可以在Xcode 4中打开它们?一旦我编辑了它们,有没有办法将它们转换回来NIB?
我试图在手写笔中使用Nib CSS3扩展.安装的手写笔和笔尖(尝试本地和全球-g).但是当我这样做时,没有一个可行
stylus styles.styl > build/styles.css
# styles.styl
@import "nib"
Run Code Online (Sandbox Code Playgroud)
我明白了
/usr/lib/node_modules/stylus/bin/stylus:502
throw err;
^
Error: styles.styl:1
> 1| @import "nib"
2|
3| body
4| background: linear-gradient(top, white, black)
failed to locate @import file nib.styl
at Evaluator.visitImport (/usr/lib/node_modules/stylus/lib/visitor/evaluator.js:659:21)
at Evaluator.Visitor.visit (/usr/lib/node_modules/stylus/lib/visitor/index.js:28:40)
at Evaluator.visit (/usr/lib/node_modules/stylus/lib/visitor/evaluator.js:75:18)
at Evaluator.visitRoot (/usr/lib/node_modules/stylus/lib/visitor/evaluator.js:521:27)
at Evaluator.Visitor.visit (/usr/lib/node_modules/stylus/lib/visitor/index.js:28:40)
at Evaluator.visit (/usr/lib/node_modules/stylus/lib/visitor/evaluator.js:75:18)
at Evaluator.evaluate (/usr/lib/node_modules/stylus/lib/visitor/evaluator.js:150:15)
at Renderer.render (/usr/lib/node_modules/stylus/lib/renderer.js:69:26)
at /usr/lib/node_modules/stylus/bin/stylus:496:15
at fs.readFile (fs.js:176:14)
Run Code Online (Sandbox Code Playgroud) 我有一个使用Interface Builder构建的custom UIView(MyCustomUIView).我想将这个自定义视图放在MyViewController视图中,该视图也是使用IB设计的.我在一个XIB中放置了UIView一个子视图MyViewController并将其设置为MyCustomUIView.问题是,当我运行代码时,只显示一个空白视图.(当我MyCustomUIView在代码中实例化时,它显示得很好.)
我只是initWithFrame:按以下方式覆盖该方法MyCustomUIView.m:
- (id)initWithFrame:(CGRect)frame
{
[[NSBundle mainBundle] loadNibNamed:@"MyCustomUIView" owner:self options:nil];
self = self.view;
return self;
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能使视图正确加载?应该initWithCoder:怎么样?
我总是使用loadNibNamed方法将自定义视图加载到视图控制器中,但现在我试图避免在自定义视图之外调用该方法使其更可重用,这样如果另一个人使用我的自定义视图,他只需要在没有loadFromNib的情况下实例化视图,例如:
var myView: MyView = MyView()
Run Code Online (Sandbox Code Playgroud)
将视图添加到视图控制器的视图就足够了,自定义视图会将nib加载到其自身内部.我试图在Swift中做到这一点,在ObjC中我发现了代码就像这个答案:UIView和initWithFrame以及一个NIB文件.如何加载NIB文件? 但是在swift中我不能使用答案中使用的init:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code.
//
[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil];
[self addSubview:self.view];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
我有这个方法,它以无限循环结束:
override init(frame: CGRect) {
super.init(frame: frame)
self.loadFromNibNamed("MyView")
}
Run Code Online (Sandbox Code Playgroud)
我也尝试在MyView中添加另一个视图作为IBOutlet,就像其他答案所说并使用所有内容:
@IBOutlet var view: UIView!
override init() {
super.init()
NSBundle.mainBundle().loadNibNamed("MediaPlayerView", owner: self, options: nil)
self.addSubview(self.view)
}
override init(frame: CGRect) {
super.init(frame: frame)
NSBundle.mainBundle().loadNibNamed("MediaPlayerView", owner: self, options: nil)
self.addSubview(self.view)
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
NSBundle.mainBundle().loadNibNamed("MediaPlayerView", …Run Code Online (Sandbox Code Playgroud)