一、注册cell
1.用nib, 向 tableview 注册 cell
全局变量 let cellIdentifier = "myCell"
myTableView!.registerNib(UINib(nibName: "MyCell", bundle:nil), forCellReuseIdentifier: cellIdentifier)
然后在 cellForRowAtIndexPath 方法中使用:
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath:NSIndexPath!) -> UITableViewCell! {
var mycell : MyCell = tableView!.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as MyCell
return mycell
}
2.用纯代码,向tableView注册cell
全局变量 let cellIdentifier = "myCell"
self.tableView.registerClass(MyCell.classForKeyedArchiver(), forCellReuseIdentifier: cellIdentifier)
然后在 cellForRowAtIndexPath 方法中使用
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! MyCell
return cell
}
3.不注册cell,系统直接创建
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
{
let identifier = "CellIdentifier"
var cell :UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(identifier) as? MyCell
cell = MyCell(style: .Default, reuseIdentifier: identifier)
var string :String = typeArray[indexPath.row] as String
cell!.textLabel.text = string
return cell
}
二、懒加载的写法
//懒加载imageview
lazy var iconImageView:UIImageView? = {
var iconImageView = UIImageView(frame: CGRectMake(20, 10, 40, 40))
self.contentView.addSubview(iconImageView)
return iconImageView
}()
不能忘了最后“}”后的小括号
三、宏定义
OC写法
#define margin_Left 30
swift写法
let margin_Left:CGFloat = 30
需要标示类型,“=”与宏名必须有至少一个空格,否则会把“=”当作宏名的一部分
四、用swift循环布局,frame没法给
let i: Int
for i = 0; i < 2; i++ {
var label1: UILabel = UILabel.init(frame: CGRectMake(margin_Left * i, margin_Top , margin_Label_Width, margin_Label_Height))
label1.text = "账号"
label1.textAlignment = NSTextAlignment.Center
self.addSubview(label1)
}
其中margin_Left为定义的CGFloat类型的宏,而i是int类型,swift中无法进行不同类型的数相乘,试了将i强转成CGFloat类型,仍然实现不了想要的效果,将CGFloat类型强转成int类型也不行,并且,布局时也不能用int类型的值
五、定义属性
OC写法
@property (nonatomic, strong) UITextField *accountTF;
swift写法
var accountTF:UITextField? 或 var accountTF:UITextField!
后面加“?”或者加“!”都行,但必须要加,否则会报错
六、init初始化方法的重写
override init(frame: CGRect) {
super.init(frame: frame)
//填写要重写的内容
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
洋红部分是对init初始化不成功的安全处理,不能少
七、button添加点击事件的写法
loginButton.addTarget(self, action: "handleLoginButton:", forControlEvents: UIControlEvents.TouchUpInside)
方法名直接以字符串的形式写,运行的时候会自动寻找,这样一来就没有任何提醒了,所以一定要正确对应。
八、cocopods的问题
使用cocoapods向swift工程中导入第三方时,遇到下面的问题
[!] Pods written in Swift can only be integrated as frameworks; add `use_frameworks!` to your Podfile or target to opt into using it. The Swift Pod being used is: Alamofire
解决方案:在生成的podfile文件中,输入“use_frameworks!”即可
九、protocol协议的写法
1.自定义协议,及要实现的方法
protocol DetailViewControllerDelegate {
func myFunc(dic: NSDictionary) //有参无返
func myFunc1() -> Int //无参有返
func myFunc2(dic: NSDictionary) -> String //有参有返
}
2.声明代理
var delegate:DetailViewControllerDelegate!
3.在合适的时机启动协议,判断有服从协议,协议方法有实现,就可以调用协议
override func viewWillDisappear(animated: Bool) {
var dic = ["account":"15771095", "password":"123456"]
if self.delegate != nil {
self.delegate?.myFunc(dic)
}
}
4.在其它的类中服从该协议
class LoginViewController: UIViewController, UITextFieldDelegate, DetailViewControllerDelegate {
}
5.添加自己为代理
var detailVC = DetailViewController()
detailVC.delegate = self
6.实现协议方法,拿到想要的值
func myFunc(dic: NSDictionary) {
loginView.accountTF?.text = dic["account"] as? String
loginView.passwordTF?.text = dic["password"] as? String
}
十、block的写法
在B class类中
1.自定义一个block
typealias callbackfunc=(selectIndex:Int)->Void
2.声明block
var myFunc = callbackfunc?()
3.传递函数
func initBack( mathFunction:(selectIndex:Int)->Void ){
myFunc = mathFunction
}
4.回调
myFunc!(selectIndex: indexPath.row);
在A class类中
5.创建B class的对象,调传递函数
xxx.initBack { (selectIndex) -> Void in
//可以做点啥了
}
注意:在使用协议和block的界面,创建定义协议和block类的对象时,要保证对象的唯一性。可以属性创建,保证整个类都可以唯一使用,也可以在创建好的时候,直接指定delegate对象,直接调用block闭包函数。如果对象不统一,协议和block就不会走,不会起作用的。
十一、服从协议时容易出现的问题
当服从某个协议时,出现以下错误,错误如下:Type ‘UIViewController’ does not conform to protocol ‘UITableViewDataSource’
原因是没有完全实现UITableViewDataSource里的所有私有协议方法,当完全实现了所有的私有协议方法后,错误就没有了。
自己创建的protocol协议,方法func前不能添加public和optional,否则报错,所以建议自定义的协议,需要什么协议方法就创建,需要多少创建多少,创建预备的协议方法也要记得实现一下。