我正在尝试在iPad应用程序中支持多个方向,而设计者提出的视图无法使用纯粹的弹簧/支柱模型进行设置.我已经在两个单独的nib文件中布局了视图,目前使用以下...
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration;
{
if (UIInterfaceOrientationIsPortrait(interfaceOrientation))
{
[[NSBundle mainBundle] loadNibNamed:@"ConfigureViewController-Portrait" owner:self options:nil];
}
else
{
[[NSBundle mainBundle] loadNibNamed:@"ConfigureViewController" owner:self options:nil];
}
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,但正如预期的那样,有点慢.有没有办法缓存这个结果?或者是否有某种方法可以完成我缺少的整个过程.只是拿着从它回来的顶级对象并没有什么帮助,因为我需要NIB知道如何连接所有东西.
我正在尝试做一些非常棘手的事情,而且我仍然陷入困境.我正在尝试UIViewController使用从其他Nib文件继承的Nib文件来实例化UIViewController.
问题是我实例化我的儿子UIViewController.
// SonViewController
- (id)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil
{
if ((self = [super initWithNibName:nibNameOrNil
bundle:nibBundleOrNil])) {
// Custom initialization.
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
init方法initWithNibName:bundle:应该调用super class它,但它只调用自己的nib文件.在超类中,我试图覆盖该initWithNibName:bundle:方法并将nibName自己放入:
// MotherViewController
- (id)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil
{
if ((self = [super initWithNibName:@"MotherViewController"
bundle:nibBundleOrNil])) {
// Custom initialization.
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
它只是初始化并显示Mother Class它的IB对象.我理解为什么,但我开始认为不可能做我想做的事.有什么建议吗?
编辑:
我会像我那样使用我的SonViewController:
SonViewController *son = [[SonViewController alloc]
initWithNibName:@"SonViewController" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:son animated:YES];
[son release];
Run Code Online (Sandbox Code Playgroud)
它应该显示儿子和母亲IB对象...... …
我正在学习国际化应用程序的基本步骤,我有一个关于本地化界面NIB文件的问题...我已经看到在Xcode中你可以点击AppViewController.xib界面文件并点击本地化部分中的+检查器窗口添加另一种语言以及默认的英语(例如我添加意大利语)...这允许我翻译意大利语界面...但是你如何保持应用程序的未来发展?例如,如果需要添加按钮,则必须手动将其添加到接口NIB文件的所有本地化版本中?文档也说
nib文件中的对象通常在它们之间具有不应该被破坏的连接.确保在将笔尖移至翻译之前锁定所有连接.有关如何锁定nib文件的信息,请参阅"Interface Builder用户指南"中的"本地化".
你能解释一下这个概念吗?我在检查器中看到了Localization Locking部分,它允许您锁定Properties,Localizable Properties或Un-localizable Properties,但我不太了解它的作用.
总而言之,我希望您建议我设计界面的本地化版本以及在界面发展时维护多个NIB文件的工作流程.
编辑:任何可以帮助我的想法和/或链接?
为了在我的应用程序中重复使用某个子视图(基于故事板),我决定将子视图构建为nib,然后加载它.为此,我做了以下操作:
我有一个UIView子类,我们可以调用Widget.我创建了一个相应的xib文件,将File owner属性设置为我的新子类,连接IBOutlets.
然后,在我的故事板中,我在视图控制器内部有一个uiview,我将它的类设置为我创建的Widget类.
在widget类中,我重写initWithCoder,并在那里加载nib,如下所示:
-(id)initWithCoder:(NSCoder *)aDecoder{
if ((self = [super initWithCoder:aDecoder])){
[self addSubview:[[[NSBundle mainBundle] loadNibNamed:@"Widget" owner:self options:nil] objectAtIndex:0]];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
应用程序此时会崩溃,并在此处设置断点显示initWithCoder被一遍又一遍地调用.
在这种情况下,我似乎混合了两种使用笔尖的方法,但我不清楚我哪里出错了.如果需要,我可以抛出堆栈跟踪,但它基本上是对同一函数的无限嵌套调用.
无论我读了多少,我都坚持使用iOS中的一个概念,我似乎无法理解.我试图用自定义设计覆盖标准iOS数字键盘.当用户触摸UITextField时,我希望显示自定义inputView而不是标准数字键盘.
我为我的自定义inputView创建了一个单独的.h/.m/.xib ViewController类,名为"customInputViewController"现在,它只是一个黑暗的背景和一个按钮,当触摸UITextField时,它会遮挡大约一半的屏幕(类似于数字垫,但它看起来不同).当我单击自定义inputView中的一个按钮时,我的实现失败 - iOS会抛出EXC_BAD_ACCESS错误.
这是我在运行时加载.xib文件并将自定义inputView附加到UITextField对象的方法:
UIViewController *v = [[customInputViewController alloc] initWithNibName:@"customInputDesign" bundle:nil];
myTextInput.inputView = v.view;
Run Code Online (Sandbox Code Playgroud)
在自定义inputView的.xib文件中,我将File的Owner设置为"customInputViewController",然后创建了一个(IBAction)方法并将其附加到UIButton.单击该按钮时,(IBAction)设置为发送NSLog(@"按钮单击")消息.没什么特别的.它只是一个简单的样板实现,继续引发错误.
也许我这样做完全错了.有谁可以提供一个简单的例子?
我有一个严重的问题,一个由XIB文件定义的视图.这是一个简单的数字输入板,按钮为0-9:

问题是在极少数情况下(如上面的屏幕截图所示),缺少按钮标签.它并不总是相同的标签(在上面的示例中,缺少"0").通常关闭视图并重新创建它可以解决问题.
XIB文件的按钮附加到视图中的UIButton控件.视图构造如下:
@property (nonatomic,strong) IBOutlet UIButton *button0;
// etc...
@property (nonatomic,strong) IBOutlet UIButton *button9;
- (id)initWithFrame:(CGRect)frame
{
self = [[UINib nibWithNibName:[[self class] description] bundle:nil]
instantiateWithOwner:nil
options:nil
][0];
if (self)
{
self.frame = frame;
// ...
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
没有涉及控制器,我也不想这样.
该视图是使用以下代码创建的:
CustomView *view = [[CustomView alloc] initWithFrame:frame];
Run Code Online (Sandbox Code Playgroud)
当问题发生时(通常不是随机的),用户点击带有缺失标签的按钮,按钮的titleLabel.text属性为nil:
- (IBAction) numberButtonPressed:(UIButton *)button
{
NSLog("button label = %@",button.titleLabel.text);
// output: button label = (null)
}
Run Code Online (Sandbox Code Playgroud)
XIB文件的XML:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="5056" systemVersion="13C64" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
<dependencies> …Run Code Online (Sandbox Code Playgroud) 在测试Swift项目中,我是子类NSWindowController.我的NSWindowController子类旨在使用特定的Nib文件.因此,希望在初始化我的窗口控制器时,窗口控制器实例自动加载nib文件.在Objective-C中,这是通过以下方式实现的:
@implementation MyWindowController
- (id)init {
self = [super initWithWindowNibName:"MyWindowNib"]
if (self) {
// whatever
}
return self
}
@end
Run Code Online (Sandbox Code Playgroud)
现在,在Swift中这是不可能的:init()不能调用super.init(windowNibName:),因为后者被声明不是指定的初始化器,而是作为方便的一个NSWindowController.
怎么能在Swift中完成?我没有看到一种直截了当的方式.
PS:我已经看到了关于这个主题的其他问题,但是,只要我能够理解,解决方案都指向通过调用初始化Window Controller init(windowNibName:).请注意,这不是理想的beheaviour.应该使用窗口控制器进行初始化init(),并且应该是窗口控制器本身"拾取"其Nib文件并加载它.
是否可以从xamarin中的自定义XIB创建和加载视图?在Objective-C中就像:
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
self.window.rootViewController = self.viewController;
Run Code Online (Sandbox Code Playgroud) 我有一个名为NormalImageCell的自定义单元格,该单元格继承自UITableViewCell并绑定到xib。假设我想创建一个名为LargeImageCell的新单元格,该单元格从NormalImageCell继承而无需创建一个全新的xib。我无需接口构建器即可轻松地以编程方式完成此操作,但是由于将NormalImageCell绑定到一个xib,并且xib中的单元只能连接到一个自定义类和一个reuseIdentifier,我如何才能将其重用于LargeImageCell?
这在没有Interface Builder的情况下有效。
class LargeImageCell: NormalImageCell {...}
tableView.registerClass(NormalImageCell.self, forCellWithReuseIdentifier: NormalImageCell.id())
tableView.registerClass(LargeImageCell.self, forCellWithReuseIdentifier: LargeImageCell.id())
Run Code Online (Sandbox Code Playgroud)
这会因Interface Builder而崩溃:
tableView.registerNib(NormalImageCell.nib(), forCellWithReuseIdentifier: NormalImageCell.id())
tableView.registerNib(LargeImageCell.nib(), forCellWithReuseIdentifier: LargeImageCell.id())
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我在声明这样的nib和id方法:
class NormalImageCell: UITableViewCell {
class func id() -> String {
return String(self)
}
class func nib() -> UINib {
return UINib(nibName: String(self), bundle: nil)
}
}
class LargeImageCell: NormalmageCell {
...
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将动态笔尖加载为容器的子视图.我几乎得到它的工作,除了子视图有一个我似乎无法摆脱的偏移(参见下面图片中的粉红色视图).
从View Hierarchy调试:
正如您在第2张图片中看到的那样,容器框架已正确定位,而子视图由于某种原因未正确定位.
我真的不知道autolayout会发生什么.
这是处理加载笔尖并将其指定为子视图的代码:
注释掉的代码是我试图使它工作的所有东西,没有成功.我认为autolayout可以独立工作而不需要做任何事情,但默认情况下它加载nib而不调整它.
这意味着前导和顶部锚是正确的,但是笔尖然后使用它的全尺寸......(参见下图)
所以问题是,为了加载笔尖并使其适合容器视图,我需要做些什么?
nib ×10
ios ×3
objective-c ×3
swift ×3
xib ×3
inheritance ×2
uiview ×2
cell ×1
cocoa ×1
cocoa-touch ×1
inputview ×1
ios5 ×1
ipad ×1
iphone ×1
localization ×1
storyboard ×1
subclass ×1
view ×1
xamarin ×1
xcode4.2 ×1