一:先配置环境:自定义Log输出(DEBUG 和 release模式),并屏蔽后台多余的打印信息swift
1:屏蔽后台多余的打印信息:若是写了OS_ACTIVITY_MODE = disable 仍是不行.把对号从新勾选就能够了.app
2:自定义log输出:1:先配置标记:框架
—>buildSettings—>搜索swift flag—>Debug -> 添加-D DEBUG 作标记--------在项目中实现:#if DEBUG #endifide
//MARK:-3:定义全局的DLog:使用全局函数:传默认参数函数
/*学习
总结:1:设置全局函数都在AppDelegate中进行设置,class 类声明以后ui
2: 自定义Log: 定义Log 1. 定义Log的打印内容this
获取所在的文件 #FILE 获取所在的方法 #FUNCTION 获取所在的行 #LINEspa
默认参数:当在方法中传参数时,也能够传入默认参数,定义:file : String = #file,默认参数在外界传递参数的时候不会显示rest
全局函数:在AppDelegate中定义全局函数:<T>表示泛型,传打印内容:func DLog<T> (message: T,fileName:String = #file,funcName:String = #function,lineNum:Int = #line) 2.DLog在Debug下 打印,在release下 不打印
定义标记项 —>buildSettings—>搜索swift flag—>Debug -> -D DEBUG 作标记--------在项目中实现:#if DEBUG #endif
3:1:#if DEBUG //DEBUG模式下
let file = (fileName as NSString).lastPathComponent;
print("\(file):\(funcName):\(lineNum):\("打印内容"):\(message)")
#endif
2:let file = (fileName as NSString).lastPathComponent;获取文件的扩展名,(fileName as NSString)将swift的字符串转为OC字符串,并调用OC的方法,关键字as,在截取字符串的时候也一般将swift的字符串转为OC字符串来进行截取
3: print("\(file):\(funcName):\(lineNum):\("打印内容"):\(message)"):插值运算:插值运算"\()"来表示。
*/
func DLog<T> (message: T,fileName:String = #file,funcName:String = #function,lineNum:Int = #line) {
#if DEBUG
let file = (fileName as NSString).lastPathComponent;
print("\(file):\(funcName):\(lineNum):\("打印内容"):\(message)")
#endif
}
二:代码
1:AppDelegate
import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { /* 总结: 1:1:window为可选类型,可选类型的定义:var window: UIWindow?,可选类型就是能够为空值nil或是由值,如果想得到可选类型的值,则能够进行可选绑定或是强制解包,如果强制解包必需要保证强制解包的值不为nil,若为nil会产生崩溃 2:var window: UIWindow?,为该类的属性,定义属性的时候,必须保证属性有初始化值,或是定义成可选类型,不然会报错 2:须要本身去建立window:建立对象就用构造函数:RHTabBarViewController(),得到实例对象以后,调用方法可使用点语法window?.makeKeyAndVisible() window = UIWindow(frame:UIScreen.main.bounds) window?.rootViewController = RHTabBarViewController() window?.makeKeyAndVisible() 3:设置全局tabBar的样式:设置tabBar的tintColor,就是改变tabbarItem的图片文字颜色,若不设置,则系统会自动将图片和文字渲染为蓝色:UITabBar.appearance().tintColor = UIColor.orange 4:设置全局的函数,或是全局的样式,都在AppDelegate文件中去设置 */ var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { //MARK:-1:建立window window = UIWindow(frame:UIScreen.main.bounds) window?.rootViewController = RHTabBarViewController() window?.makeKeyAndVisible() //MARK:-2:设置全局tabbar的样式 UITabBar.appearance().tintColor = UIColor.orange DLog(message: "123") return true } func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. } func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } func applicationWillEnterForeground(_ application: UIApplication) { // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. } func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } } //MARK:-3:定义全局的DLog:使用全局函数:传默认参数 /* 总结:1:设置全局函数都在AppDelegate中进行设置,class 类声明以后 2: 自定义Log: 定义Log 1. 定义Log的打印内容 获取所在的文件 #FILE 获取所在的方法 #FUNCTION 获取所在的行 #LINE 默认参数:当在方法中传参数时,也能够传入默认参数,定义:file : String = #file,默认参数在外界传递参数的时候不会显示 全局函数:在AppDelegate中定义全局函数:<T>表示泛型,传打印内容:func DLog<T> (message: T,fileName:String = #file,funcName:String = #function,lineNum:Int = #line) 2.DLog在Debug下 打印,在release下 不打印 定义标记项 —>buildSettings—>搜索swift flag—>Debug -> -D DEBUG 作标记--------在项目中实现:#if DEBUG #endif 3:1:#if DEBUG //DEBUG模式下 let file = (fileName as NSString).lastPathComponent; print("\(file):\(funcName):\(lineNum):\("打印内容"):\(message)") #endif 2:let file = (fileName as NSString).lastPathComponent;获取文件的扩展名,(fileName as NSString)将swift的字符串转为OC字符串,并调用OC的方法,关键字as,在截取字符串的时候也一般将swift的字符串转为OC字符串来进行截取 3: print("\(file):\(funcName):\(lineNum):\("打印内容"):\(message)"):插值运算:插值运算"\()"来表示。 */ func DLog<T> (message: T,fileName:String = #file,funcName:String = #function,lineNum:Int = #line) { #if DEBUG let file = (fileName as NSString).lastPathComponent; print("\(file):\(funcName):\(lineNum):\("打印内容"):\(message)") #endif }
2:RHTabBarViewController
import UIKit class RHTabBarViewController: UITabBarController { /** 总结:1:1:在RHTabBarViewController上添加子控制器:须要封装一个函数(封装的函数写在class类里),外部传控制器对象,title,imageName 2:swift支持方法的重载,方法的重载:方法名称相同,可是参数不一样. --> 1.参数的类型不一样 2.参数的个数不一样,在定义函数时使用private修饰,表示在当前文件中能够访问,可是其余文件不能访问private func addChildViewController(_ childController: UIViewController,title : String,imageName:String),其中第一个参数的下划线能够省略,那么若是省略外部调用,第一个参数名就会显示出来, addChildViewController(childController: <#T##UIViewController#>, title: <#T##String#>, imageName: <#T##String#>) 若是不省略: addChildViewController(<#T##childController: UIViewController##UIViewController#>, title: <#T##String#>, imageName: <#T##String#>) 2:建立对象用的是构造函数:RHHomeTableViewController(),在封装的方法中,设置tabBar的标题,图片:childController.title, childController.tabBarItem.image, childController.tabBarItem.selectedImage 其中: childController.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted"),字符串与字符串的拼接就用 + ,添加子控制器:addChildViewController(childNav),能够省略self去调用 */ override func viewDidLoad() { super.viewDidLoad() //MARK:-1:添加子控制器 //首页 addChildViewController(RHHomeTableViewController(), title: "首页", imageName: "tabbar_home") //信息 addChildViewController(RHMessageTableViewController(), title: "信息", imageName: "tabbar_message_center") //发现 addChildViewController(RHDiscoverViewController(), title: "发现", imageName: "tabbar_discover") //我 addChildViewController(RHProfileTableViewController(), title: "我", imageName: "tabbar_profile") } //MARK:-1:添加子控制器:private:私有方法, private func addChildViewController(_ childController: UIViewController,title : String,imageName:String) { //1:设置子控制器tabBarItem的标题图片 childController.title = title; childController.tabBarItem.image = UIImage(named: imageName) childController.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted") //2:添加子控制器 let childNav = UINavigationController(rootViewController: childController) addChildViewController(childNav) } }
补充:
在Swift中,下划线有不少妙用,这里将已经看到的妙用进行总结,但愿能够帮助更多学习Swift的朋友。
1.格式化数字字面量 经过使用下划线能够提升数字字面量的可读性,例如:
2.忽略元组的元素值
当咱们使用元组时,若是有的元素不须要使用,这时可使用下划线将相应的元素进行忽略,例如:
代码中,只关心http404Error中第二个元素的值,因此第一个元素可使用下划线进行忽略。
3.忽略区间值
有时候咱们并不关心区间内每一项的值,可使用下划线来忽略这些值。
4.忽略外部参数名
(1).忽略方法的默认外部参数名 在使用方法(类方法或者实例方法)时,方法的第二个参数名及后续的参数名,默认既是内部参数名,又是外部参数名,若是不想提供外部参数名,能够在参数名前添加(下划线+空格)来忽略外部参数名。
在上面的代码中,方法incrementBy()中的numberOfTimes具备默认的外部参数名:numberOfTimes,若是不想使用外部参数名可使用下划线进行忽略,代码能够写为(不过为了提升代码的可读性,通常不进行忽略):
(2).忽略具备默认值的参数的外部参数名 当函数(或者方法)的参数具备默认值时,Swift自动为该参数提供与参数名一致的默认外部参数名,所以在进行函数调用的时候,要提供默认参数名,可使用下划线进行忽略默认外部参数名。
若是不想使用默认外部参数名,能够进行以下修改(一样不推荐省略外部参数名):
// 设置总体主题TabBar的tintColor UITabBar.appearance().tintColor = UIColor.orangeColor() // 1.建立window self.window = UIWindow(frame: UIScreen.mainScreen().bounds) self.window?.backgroundColor = UIColor.whiteColor() // 2.设置window的根控制器 self.window?.rootViewController = MainViewController() // 3.让窗口生效 self.window?.makeKeyAndVisible()
override func viewDidLoad() { super.viewDidLoad() // 添加自控制器 self.addChildViewController(HomeViewController(), imageName: "tabbar_home", title: "主页") self.addChildViewController(MessageViewController(), imageName: "tabbar_message_center", title: "消息") self.addChildViewController(DiscoverViewController(), imageName: "tabbar_discover", title: "广场") self.addChildViewController(ProfileViewController(), imageName: "tabbar_profile", title: "我") } private func addChildViewController(childCVc: UIViewController, imageName : String, title : String) { // 1.建立自控制器 let homeNav = UINavigationController(rootViewController: childCVc) // 2.设置标题 childCVc.title = title childCVc.tabBarItem.selectedImage = UIImage(named: imageName + "_highlighted") childCVc.tabBarItem.image = UIImage(named: imageName) // 3.添加到UITabbarController self.addChildViewController(homeNav) }