分类 笔记 下的文章

给控件绑定事件函数的时候,报错

在手动给控件添加事件的时候,报错
代码如下

class ViewController: UIViewController {

    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var lable: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        button.addTarget(self, action: "buttonDown:", forControlEvents: .TouchDown)
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func buttonDown(sender:AnyObject)
    {
        lable.text = "哈哈哈,来个hellow,world"
    }
}

报错如下

fatal error: unexpectedly found nil while unwrapping an Optional value

后来把控件都删除,重新拖一下就好了。。。。

利用NSObject实现观察者模式(KVO模式)

类定义

class huofu:NSObject
{
    dynamic var danchaofan = ""
    func update(status:String)
    {
        danchaofan = status
    }
}
class xiaohuoban:NSObject {
    init(objectToObserver:AnyObject) {
        super.init()
        //添加传递进来的类的观察者
        objectToObserver.addObserver(self, forKeyPath: "danchaofan", options: .New, context: &myContext)
    }
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]!, context: UnsafeMutablePointer<Void>) {
        if context == &myContext
        {
            print("\(change![NSKeyValueChangeNewKey])")
        }
    }
}

运行代码

let chaoge:huofu = huofu()
let huoban:xiaohuoban = xiaohuoban(objectToObserver: chaoge)
chaoge.update("更新1")
chaoge.removeObserver(huoban, forKeyPath: "danchaofan")

上面这样,可以正常运行,输出是正确的,但是之后会报错

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'An instance 0x7fdad1c0d270 of class CoreDataTest.huofu was deallocated while key value observers were still registered with it. Current observation info:

大概就是因为被观察的已经被回收了,但是观察者依然存在
改成下面就ok了

let chaoge:huofu = huofu()
let huoban:xiaohuoban = xiaohuoban(objectToObserver: chaoge)
chaoge.update("更新1")
chaoge.removeObserver(huoban, forKeyPath: "danchaofan")

swift使用CoreData增删改查

在新建项目的时候勾选 Use Core Data,在项目地下就会出现 以 .xcdatamodeld`结尾的文件,然后再里面可以新建托管对象模型(也称为实体),实体属性之类的,百度一下就可以搜索到 还有在AppDelegate.swift文件也已经生成了一些属性和方法,通过调用这些方法来实现增删改查 新建好实体之后,就可以生成托管对象,可以直接通过xcode生成Editor>Create NSManagedObject Sub...`然后选择下数据模型,要生成的实体,语言之类的信息,就ok了,
代码部分

//给实体增加新的托管对象,as关键字之前执行完会返回NSManagedObject对象,用 as! 关键字转换成 book 对象方便之后的赋值
var object:Book = NSEntityDescription.insertNewObjectForEntityForName("Book", inManagedObjectContext: self.managedObjectContext) as! Book
//赋值
object.name = "aaaa"
object.author = "aaaaa"
//保存,这个执行来就保存到文件中了
self.saveContext()

//通过实体名获取请求对象
let request = NSFetchRequest(entityName: "Book")
//指定查询条件
let predicate = NSPredicate(format: "%K != %@", "name","aaa")
//设置请求对象查询条件
request.predicate = predicate
//查询,因为 executeFetchRequest 方法是一个 throwing函数 所以用 try? 关键字,如果抛出异常的话会返回 nil,成功的话会返回一个对象数组 //转换成book对象数组,方便之后显示
let result = (try? self.managedObjectContext.executeFetchRequest(request)) as! [Book]
print(result)
//输出 "Optional("aaaa")"
print(result[0].name)


//获取请求对象
let request = NSFetchRequest(entityName: "Book")
//设置查询条件
let predicate = NSPredicate(format: "%K != %@", "name","sadasd")
//设置请求查询条件
request.predicate = predicate
//查询
if let result = try? self.managedObjectContext.executeFetchRequest(request)
{
    //循环查询结果数组
    for resultTemp in result
    {
    //打印实体值
    print((resultTemp as! Book).author)
    //判断是否是正确的对象
    if resultTemp is NSManagedObject
        {
            //修改值
            resultTemp.setValue("root", forKey: "author")
        }
    }
}
//上面的只是修改,并买油保存,这里执行保存,就改变了持久化数据的内容了
self.saveContext()

let request = NSFetchRequest(entityName: "Book")
let predicate = NSPredicate(format: "%K != %@", "name","asdasd")
request.predicate = predicate
if let result = (try? self.managedObjectContext.executeFetchRequest(request)) as? [NSManagedObject]
{
    //输出查询结果,查看删除是否有效
    print(result)
    for resultValue in result
    {
        if resultValue is NSManagedObject
        {
            self.managedObjectContext.deleteObject(resultValue)
        }
    }
}
self.saveContext()

swift后台进程

class IPhoneMainView:NSObject {
    var lock = NSLock()
    var imageDB = [String]()
    var workerForImage:NSThread?
    func show()
    {
        //启动一个进程
        workerForImage = NSThread(target: self, selector: "run", object: nil)
        workerForImage!.name = "负责在后台下载图片"
        workerForImage!.start()
    }
    func hide()
    {
        workerForImage!.cancel()
    }
    func run()
    {
        while(true)
        {
            imageDB.append("第\(imageDB.count+1)张")
            print("下好了第\(imageDB.count+1)张")
            NSThread.sleepForTimeInterval(0.1)
            if NSThread.currentThread().cancelled
            {
                NSThread.exit()
                print("收到线程结束请求,顺利结束进程")
            }
        }
    }
}
var iphoneView = IPhoneMainView()
iphoneView.show()
while(true)
{
    var date = NSDate()
    NSRunLoop.currentRunLoop().runUntilDate(date.dateByAddingTimeInterval(50))
    break
}
iphoneView.hide()

swift定时器

import Foundation

//定义消息泵
class OCMessagePump: NSObject {
    var timer:NSTimer?
    var count = 0

    func start()
    {
        //初始化
        timer = NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: "timerFireMethod", userInfo: nil, repeats: true)
        timer?.fire()
    }
    func stop()
    {
        timer!.invalidate()
    }
    func timerFireMethod()
    {
        print("接受消息定时派发命令,处理控件消息: OCButtonClicked 消息")
        //向通知中心推送消息,注意这里是异步的,且消息标示是:MessageReceiver
        NSNotificationCenter.defaultCenter().postNotificationName("OCButtonClicked", object: nil)
        //派发十条停止定时器
        if count++ > 10
        {
            self.stop()
        }
    }
}
class OCButton: OCMessagePump {
    override init()
    {
        super.init()
        //向通知中心注册自己的消息处理函数
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "ButtonClicked:", name: "OCButtonClicked", object: nil)

    }
    func ButtonClicked(notify:NSNotification)
    {
        print("收到消息泵通知,当前按钮被单机")
    }
}
//初始化消息接受者
var button = OCButton()
//初始化消息泵
var ocMessagePump = OCMessagePump()
//启动消息泵
ocMessagePump.start()
//延时当前主循环
while (true)
{
    var date = NSDate()
    NSRunLoop.currentRunLoop().runUntilDate(date.dateByAddingTimeInterval(100))
    break
}

会输出十次

接受消息定时派发命令,处理控件消息: OCButtonClicked 消息
收到消息泵通知,当前按钮被单机

在学习的书上的例子,记录下,说不定之后有用,看不懂英文太伤了