这是我的Objective-C代码,我用它来为我的自定义加载一个笔尖UIView:
-(id)init{
NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"myXib" owner:self options:nil];
return [subviewArray objectAtIndex:0];
}
Run Code Online (Sandbox Code Playgroud)
Swift中的等效代码是什么?
在目标c中,它可以在init方法中完成
-(id)init{
self = [[[NSBundle mainBundle] loadNibNamed:@"ViewBtnWishList" owner:0 options:nil] objectAtIndex:0];
return self;
}
Run Code Online (Sandbox Code Playgroud)
但是当我快速地这样做时
init(frame: CGRect) {
self = NSBundle.mainBundle().loadNibNamed("ViewDetailMenu", owner: 0, options: nil)[0] as? UIView
}
Run Code Online (Sandbox Code Playgroud)
无法在方法中分配给self自己显示错误.现在我的方法是创建一个视图,并将从nib加载的视图添加到它.谁都有更好的主意?
我想为Google Maps for iOS制作一个自定义信息窗口,如下图所示.是否有可能像GMSMarker,GMSPolyline和GMSPolygon那样扩展GMSOverlay以创建自定义图形?

我在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) 我有2个类,第一个类名为"store",我在其中创建一个调用方法的按钮:"storeSelected"位于第二个类中,名称为ExploreViewController.
该方法应该打印"完成"并带我到另一个视图控制器.如果没有segue,则会打印"done",但是当放置segue代码时,app会崩溃.
错误是:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<Glam.ExploreViewController: 0x14ed3be20>) has no segue with identifier 'ok''
.........
// ExploreViewController Class
let _sharedMonitor: ExploreViewController = { ExploreViewController() }()
class ExploreViewController: UIViewController, UIScrollViewDelegate {
class func sharedMonitor() -> ExploreViewController {
return _sharedMonitor
}
func storeSelected(sender: UIButton) {
println("done") // it entered here and "done" is printed
self.performSegueWithIdentifier("ok", sender: self) //here is the problem
}
}
// another class named "Store"
// button is created …Run Code Online (Sandbox Code Playgroud) 我需要使用分段控件来更改视图.在以下示例中,我将两个视图容器放在同一位置:
第二个容器是隐藏的,每次我使用分段控件时我都会通过代码显示它.(虽然它也没有显示出来.)
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var container1: UIView!
@IBOutlet weak var container2: UIView!
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func showComponent(_ sender: Any) {
if (sender as AnyObject).selectedSegmentIndex == 0 {
UIView.animate(withDuration: 0.5, animations: {
self.container1.alpha = 1
self.container2.alpha = 0
})
} else {
UIView.animate(withDuration: 0.5, animations: {
self.container1.alpha = 0
self.container2.alpha = 1
})
}
}
}
Run Code Online (Sandbox Code Playgroud)
你知道其他任何方法吗?
有没有办法自定义SegmentedControl,好像它是一个TAB?