iOS初学知识点积累

1.控价相对于父控件居中:
点击Align按钮,选择Horizontally in Container 为水品居中,Vertically in Container为竖直居中
2.多个同级控件居中:
同时选中多个控件,点击Align按钮,选中Horizontal Centers相对于水平线居中,Vertical Centers竖直线居中,Baselines基线居中。
3.storyboard的controller和代码controller关联:
在storyboard中创建一个VC,新建一个swift文件导入UIKit继承UIViewController,点击VC顶部三个图标的最左边的,查看属性中的Custom Class选中创建的ViewController类即完成关联。
4.将SVC(Storyboard View Controller)中的控件关联到CVC(Code ViewController):
控件关联:点击两个环的按钮进入到代码和界面同时显示的方式,选中SVC中的控件按control键,拖动到代码区,在弹出框中填写名字connet即可
事件关联:选中控件,点击向右的箭头在下面Touch up Inside右侧的圆圈,拖到代码区域,填写名称connect即可。
关联失败处理:
关闭Xcode
shift+command+G弹出框,复制目录~/Library/Developer/XCode/DerivedData,进入后删除以项目名为开头的文件夹
打开Xcode即可
4.代码控制页面跳转
使用segue方式:选中源SVC中的控制器图标,右键拖动Show Detail到目标SVC就生成了一个segue,选中后点属性图标设置Identifier属性,在代码中调用self.performSegue(withIdentifier: "xxxx", sender: sender.self)
5.访问网络

//post
        let parameters: Parameters = [
            "email":"fangdean@yeah.net",
            "password":"123456"
        ]
        Alamofire
            .request("http://169.254.175.202:8888/user/user/login", method: .post , parameters: parameters)
            .responseJSON {(dataResponse) in
                if let json = dataResponse.result.value {
                    print("json: \(json)")
                }
            }
//get
        Alamofire
            .request("http://169.254.175.202:8888/user/user/login?email=fangdean@yeah.net&password=123456")
            .responseJSON {(dataResponse) in
                if let json = dataResponse.result.value {
                    print("json: \(json)")
                }
            }
//获取String为
        Alamofire
            .request("http://169.254.200.61:8888/user/user/login", method: .post , parameters: parameters)
            .responseString(completionHandler: {(response : DataResponse<String>) in
                switch response.result {
                case .success(let value):
                    print("返回字符串:\(value)")
                    break
                case .failure(let error):
                    print("error msg: \(error.localizedDescription)")
                    break
                }
            })

6.弹出对话框:

        let alertView = UIAlertView();
        alertView.title = "登陆信息";
        alertView.message = "邮箱为:\(txtEmail.text!) 密码为:\(txtPassword.text!)";
        alertView.addButton(withTitle: "OK");
        alertView.show();

7.定义数据Model:
继承Codable,不要赋值

import UIKit
class User: Codable {
    var id:Int64
    var name:String
    var email:String
    var password:String
    var loginState:Int
    var machineNum:Int
    var updateTime:Int64
}

8.导入第三方库:
新建Podfile文件:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0'
use_frameworks!
target 'MiniLife-swift' do
    pod 'Alamofire', '~> 4.7'
    pod 'Moya', '~> 11.0'
end

安装配置文件中的库:
pod install
关闭xcode,点击xxx.xcworkspace打开xcode,发现已经引入pod
9.使用cocoaPods

//显示镜像地址
gem sources -l
//移除镜像地址
gem sources --remove https://rubygems.org/
//设置镜像地址
gem sources -a https://ruby.taobao.org/
//安装cocoapods
sudo gem install cocoapods
//查看库是否可用
pod search AFNetworking
//升级cocospods库
pod repo update

10.安装Ruby环境

//列出Ruby环境列表
rvm list known
//安装环境
rvm install 2.4.1
//把某个环境作为默认Ruby环境
rvm use 2.4.1 --default

11.JSON转Codable:
解析类型必须一一对应,否则识别不了,字段可为空要用Optional类型

//嵌套Codable
import Foundation
struct ResponseEntity: Codable {
    struct User: Codable {
        var id:Int64
        var name:String
        var email:String
        var password:String
        var loginState:Int!
        var machineNum:String!
        var updateTime:Int64!
    }
    var content: User
    var code: Int
    var msg: String
}
        let jsonString = "{\"content\":{\"id\":1,\"name\":\"房德安\",\"email\":\"fangdean@yeah.net\",\"password\":\"123456\",\"loginState\":0,\"machineNum\":\"0\",\"updateTime\":0},\"code\":1,\"msg\":\"登录成功\"}"
        guard let jsonData = jsonString.data(using: .utf8) else {
            print("JOSN字符串转JSON对象失败")
            return
        }
        guard let obj = try? JSONDecoder().decode(ResponseEntity.self, from: jsonData) else {
            print("JSON对象转Model失败")
            return
        }
        print("msg:\(obj.msg)")
        print("code:\(obj.code)")
        print("name:\(obj.content.name)")

12.泛型模板类:可以使用泛型,字段页可以为空(要用!),类型不能错

//外层类
import Foundation
struct ResponseBean<T>: Codable where T: Codable {
    var content: T
    var code: Int
    var msg: String
}
//内层类
import Foundation
struct User: Codable {
    var id:Int64
    var name:String
    var email:String
    var password:String
    var loginState:Int
    var machineNum:String
    var updateTime:Int64
}

13.最终Alamofire+JSON+Codable网络JSON解析为Model

        Alamofire
            .request("http://169.254.200.61:8888/user/user/login", method: .post , parameters: parameters)
            .responseString(completionHandler: {(response : DataResponse<String>) in
                switch response.result {
                case .success(let value):
                    print("返回字符串:\(value)")
                    guard let jsonData = value.data(using: .utf8) else {
                        print("JOSN字符串转JSON对象失败")
                        return
                    }
                    guard let obj = try? JSONDecoder().decode(ResponseBean<User>.self, from: jsonData) else {
                        print("JSON对象转Model失败")
                        return
                    }
                    print("msg:\(obj.msg)")
                    print("code:\(obj.code)")
                    print("name:\(obj.content.name)")
                    break
                case .failure(let error):
                    print("error msg: \(error.localizedDescription)")
                    break
                }
            })

14.数据库:Core Data
新建项目时选择Use Core Data,就会生成一个.xcdatamodeld的文件
打开次文件AddEntity,+ Attributes来添加表,右侧属性栏设置表名和Model名
不需要创建新的类,系统就会生成对应的Model类
使用先导入import CoreData

//1.增
        //获取管理的数据上下文对象
        let app = UIApplication.shared.delegate as! AppDelegate
        let context = app.persistentContainer.viewContext
        //创建TUser对象
        let tuser = NSEntityDescription.insertNewObject(forEntityName: "TUser", into: context) as! TUser
        tuser.id = user.id
        tuser.name = user.name
        tuser.password = user.password
        tuser.email = user.email
        tuser.loginState = 1
        tuser.machineNum = user.machineNum
        tuser.updateTime = user.updateTime
        do {
            //保存
            try context.save()
            print("保存成功")
            self.performSegue(withIdentifier: "login_to_main", sender: sender.self)
        } catch {
            print("保存失败")
        }
//2.查
        let email = "fangdean@yeah.net"
        let password = "123456"
        //获取管理的数据上下文对象
        let app = UIApplication.shared.delegate as! AppDelegate
        let context = app.persistentContainer.viewContext
        //查询条件
        let fetchRequest = NSFetchRequest<TUser>(entityName: "TUser")
        fetchRequest.fetchLimit = 1
        fetchRequest.fetchOffset = 0
        let predicate = NSPredicate(format: "email = %@ and password = %@ and loginState = 1", email,password)
        fetchRequest.predicate = predicate
        do {
            let fetchedObjects = try context.fetch(fetchRequest)
            //查出之后显示数据
            if fetchedObjects.count > 0 {
                let obj = fetchedObjects[0]
                print("用户已登录")
                print("name:\(obj.name!),\(obj.updateTime)")
            } else {
                print("用户未登录")
            }
        } catch {
            print("查询失败")
        }
//3.改
//查出之后
            let fetchedObjects = try context.fetch(fetchRequest)
            if fetchedObjects.count > 0 {
                let obj = fetchedObjects[0]
                obj.updateTime = 11111
                try context.save()
            } else {
                print("用户未登录")
            }
//4.删:查出之后
            let fetchedObjects = try context.fetch(fetchRequest)
            if fetchedObjects.count > 0 {
                let obj = fetchedObjects[0]
                context.delete(obj)
                try context.save()
            } else {
                print("用户未登录")
            }

15.使用三层泛型嵌套:

struct ResponseBean<T>: Codable where T: Codable {
    var content: T!
    var code: Int
    var msg: String
}
struct ResponseListBean<K>: Codable where K: Codable {
    var content:[K]!
    var totalNum:Int64
    var totalPage:Int64
    var pageSize:Int64
}
struct Category: Codable {
    var id:Int64!
    var parentId:Int64!
    var userId:Int64!
    var name:String!
    var orderNum:Int32!
    var updateTime:Int64!
}
//转换
guard let obj = try? JSONDecoder().decode(ResponseBean<ResponseListBean<Category>>.self, from: jsonData) else {
    print("JSON对象转Model失败")
    return
}

16.使用Core Data的NSFetchRequest时,参数如果为数值型需要封装为NSNumber类型

let predicate = NSPredicate(format: "parentId = 0 and userId = %@", NSNumber(value: userId!))

17.页面跳转时传递数据:
在目标Controller中定义一个变量
在源Controller中实现prepare方法
当执行performSegue()方法之前会执行此方法
在目标Controller中直接使用赋值的变量

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let controller = segue.destination as! GoodsController
        controller.parentId = parentClickId
    }

18.代码segue返回:

self.presentingViewController?.dismiss(animated: true, completion: nil)

19.UILabel控件根据内容确定行数:Label属性的Lines设为0即可

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • 有时间写些东西,却突然不知道该写些什么。一面觉得想说的东西太多而不知从何说起,一面又觉得无话可说。其实说也是对自己...
    Citrus_阅读 203评论 0 0
  • 我有一个关于 ……的不宽恕 它让我想到…. 这个不宽恕对我影响是….. 我有一个划行速度慢的不宽恕,汪洋无边的海面...
    如常0811阅读 212评论 0 0
  • 区块链的发展在中国如此2017年如此火爆,甚至可以说疯狂。在世界其他国家的发展情况是怎样的,难道只有中国在自娱自乐...
    小飞_360b阅读 3,630评论 0 1
  • 20170627觉察当下:今天晚上6点半左右,和平时一样吃好晚餐,准备收拾好一切去辅导女儿做会儿作业!最近天气总是...
    O红叶O阅读 82评论 0 0