我在swift项目中加载xib文件有一些奇怪的问题.这太令人沮丧,因为我已经知道如何在Obj-C中做到这一点.但是因为swift很快,所以你不能像你那样做..:/
所以我创建了IconTextFiled.xib和IconTextField.swift.(扩展UITextField)在xib中我在Idenity检查器中填充字段Class,在故事板中我对一些textFields执行相同操作.所以我们很高兴只需从xib添加加载到init方法?没有.
在objc我会这样做
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"IconTextField" owner:self options:nil];
self = [nib objectAtIndex:0];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
所以我想如果我翻译成swift就会很好.
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
let nib:NSArray = NSBundle.mainBundle().loadNibNamed("IconTextField", owner: self, options: nil)
self = nib.objectAtIndex(0)
}
Run Code Online (Sandbox Code Playgroud)
但那不起作用.我不知道为什么,但它试图创建更多的对象和崩溃
最后我发现了扩展
extension IconTextField {
class func loadFromNibNamed(nibNamed: String, bundle : NSBundle? = nil) -> IconTextField? {
return UINib(
nibName: nibNamed,
bundle: bundle
).instantiateWithOwner(nil, options: nil)[0] as? IconTextField
}
} …Run Code Online (Sandbox Code Playgroud) 我在ios 8 beta 4中创建了一个测试项目,它作为主视图控制器和第二个视图控制器创建为带有xib文件的UIViewController子类.
我在主控制器上放了一个按钮来显示第二个控制器:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
@IBAction func testVCBtnTapped() {
let vc = TestVC()
presentViewController(vc, animated: true, completion: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
Run Code Online (Sandbox Code Playgroud)
}
我运行应用程序并按下按钮显示第二个控制器 - 一切都很好
转到xcode beta 5,我运行应用程序,当我按下按钮时,屏幕变黑.
因为我知道他们搞砸了init代码,所以我尝试使用覆盖来查看它会修复它:
class TestVC: UIViewController {
override init() {
super.init()
}
required init(coder aDecoder: NSCoder!) {
super.init(coder: …Run Code Online (Sandbox Code Playgroud) 这是一个相当大的问题:奥特莱斯没有出现在 IB 中。
重现:
1)我将变量声明为 IBOutlet,例如在我的视图控制器的 .h 文件中
@property (nonatomic, strong) IBOutlet UILabel* testlabel;
Run Code Online (Sandbox Code Playgroud)
2)我打开故事板,单击视图控制器。- 如果这是一个新项目,则没有“Outlet”列表。- 如果这是一个已定义插座的旧项目,则“插座”列表包含以前的插座,但不包含我添加的插座。
有没有人遇到同样的问题。这非常重要,因为除非我停止使用 Outlet,否则我基本上无法继续。我在发行说明中找不到有关它的任何信息。
编辑我在 youtube 上添加了一个视频来显示问题,以防我没有正确解释它。如果我忘记了一些明显的事情,我很高兴被嘲笑:) 也就是说,我一直在遵循这些相同的操作,而奥特莱斯也一直在列表中。
编辑2为了清楚起见,我删除了 ivar 声明,因为它似乎引起了大部分关注。
编辑3好的,我似乎遇到了之前在这个问题和另一个问题上看到的问题。基本上,如果我打开自定义类下拉列表,我只会看到一些“标准”类,例如 UIViewController。如果我选择其中任何一个,我就会得到奥特莱斯。例如,对于 UIViewController 我总是有 view->View。但是,我的项目的课程不在下拉列表中。手动输入名称似乎可行,但实际上不行。一定存在一些索引问题(除非我已经删除了其中的所有内容)
~/Library/Developer/Xcode/DerivedData/
Run Code Online (Sandbox Code Playgroud)
没有成功。如果您想尝试,我已将我的代码放在GitHub上。这并没有为我显示奥特莱斯,但它为其他一些人显示了 - 所以严格来说,这不是代码的“错误”。这更多是一个 XCode 问题。欢迎任何帮助!
编辑4我认为这就是问题所在:看右边。下拉菜单不显示“ViewController.h”类。如果我手动输入它,它似乎可以识别它,但实际上我怀疑它不能识别。以前,我总是在下拉菜单中看到项目类的完整列表。