swift项目:微博

Swift项目:新浪微博

声明:本文为博主Donkey-Tao 原创,如需转载请注明出处。

本项目使用swift3完成。

写在项目之前:

Swift中自定义LOG:在Debug环境下打印内容,但是在Release环境下不显示打印

  • 自定义标记->项目 ->buildSettings -> Swift flag -> Debug ->-D DEBUG
  • if DEBUG 和endif

1.获取所在文件:

// 1.获取打印所在的文件
let file=(#file as NSString).lastPathComponent

2.获取打印所在的方法

// 2.获取打印所在的方法
let funcName = #function

3.获取打印所在的行

// 3.获取打印所在行数
let lineNum = #line

4.整个到一个TFLog函数中,并将函数放在AppDelegae.swift中,这样可以实现整个项目中都可以用,利于团队合作。

func TFLog(_ messsage : T, file : String = #file, funcName : String = #function, lineNum : Int = #line) {

    #if DEBUG  
        let fileName = (file as NSString).lastPathComponent  
        print("\(fileName):(\(lineNum))-\(messsage)") 
    #endif
}

其中上面函数中的

#if DEBUG

#endif

可以通过TAGETS -> Build Settings -> Other Swift Flags -> Debug ->Any Architecture|Any SDK方式修改,在其中添加"-D DEBUG",表示debug环境下有这样的一个标记。加上上面的这些就可以让TFLog()打印的东西在Debug环境下显示,在Release环境下不显示。

到此在项目中以后就可以使用这样的自定义的TFLog()函数作为打印调试用,以后在其他的项目中也可以直接拿过去就用。

项目的部署:OSChina

本项目采用Git管理源代码,为个人练手项目。所以,源代码开源且同时部署在GitHub和OSChina上面。

首先在OSChina上面新建项目SinaWeib。这里没有采用SSH方式实现代码的管理,而是采用HTTPS方式来进行代码的管理。https://git.oschina.net/taofei0610/SinaWeibo.git

然后将项目Clone到的我的电脑上面,打开终端进入到代码存储的目录下,使用命令Clone下OSChina上面的项目。

//用到的命令
cd /Users/taofei/Documents/TFCode/TFOSChina
git clone https://git.oschina.net/taofei0610/SinaWeibo.git
cd SinaWeibo
touch .gitignore
git add .
git commit -m "add gitignore"
git push

到此就将OSChina上面的项目Clone下来了,但是由于OSChina上面创建项目时没有swift的.gitignore,所以我们要去GiyHub中找到swift项目开发中的gitignore并将其复制后加入我们的项目中。(https://github.com/github/gitignore)

注意:一般在这里复制的.gitignore中的内容时最好将#Pods中的#去掉,这样上传时不用将CocoaPods中的文件上传,只上传Podfile中的内容

这样关于swift的.gitignore文件就在项目中了,我们需要git对其进行管理。用命令将其加入然后提交本地最后push到OSChina即可。

下面我们就可以新建swift项目放到刚才clone下来的与.gitignore同级的目录下。用Xcode创建完项目后我们就可以利用Xcode集成的Source Controller来commit,push项目代码了,当然命令行重度用户可以继续命令行也是特别好的。(此过程中第一次要输入OSChina的账号密码,直接输入就好了。)到此,项目部署完毕。

注意:这里项目名称一定要规范尽量不要出现特殊的符号

项目的基本设置

项目配置

  • 部署版本(Deployment Target):本项目支持9.0及以上版本。(Swift很多要用到的语法比较新)
  • 设备(Devices):iPhone
  • 设备方向(Device Orientation):本项目只支持竖屏。
  • 启动图片(Launch Screen Source):Use Asset Catalog.

到这里我们可以将已有的启动图片添加到项目的启动图片文件夹中了。要想尽量没有警告可以将没有用到的items移除。项目图标也是同样。

这里APP在模拟器上显示的是用们的项目名称,要想让其显示对用户比较有好多名称在项目的info.plist文件中修该Bundle name(或者Bundle display name) 后面的值为自己想要显示给用户的名称即可。我这里改为:微博。

最后设置下项目前缀(class prefix):TF

整理项目文件目录结构

加入classes文件夹,里面分为:Main,Home,Message,Discover,Profile.

注意:整理完目录结构要记得提交

纯代码初始化项目

一般现在公司用storyboard还是比较多的,苹果推出的很多技术都是storyboard相关的。本项目用纯代码来实现是为了在此过程中熟练swift开发。

既然是纯代码方式就要将Main Interface中的main去掉,然后自己在AppDelegate中创建Window。

创建窗口的跟控制器为:TFMainTabBarController,放在Main文件夹中。在AppDelegate中设置window的跟控制器时使用到TFMainTabBarController时不需要import。

首先要解决默认蓝色的tabBarItem选项的问题

//解决解决默认蓝色的tabBarItem选项图片的问题
tabBar.tintColor = UIColor.orange

//或者在AppDelegate中设置tabBar的全局背景色
UITabBar.appearance().tintColor = UIColor.orange

在TFMainTabBarController中我们要添加最少五个控制器,其中四个是类似的。所以,在此我们可以重载addChildViewController方法,并将其设置为private。将具体的添加子控制器要做的事封装在这个方法中。然后在主控制器中添加这四个相似的子控制器。

当然也可以传字符串给函数,让去创建子控制器

//0.1获取命名空间,根据字符串创建控制器
let nameSpace = Bundle.main.infoDictionary!
guard let childController = NSClassFromString(nameSpace + "." + guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else{

    TFLog("没有获取到命名空间")
    return      
}
guard let _ = NSClassFromString(nameSpace + "." + "TFHomeViewController")else{

    TFLog("根据字符串创建控制器失败")
    return
}
//0.2将对应的AnyClass转换为控制器类型
guard let childVCType = childController as? UIViewController.Type else{

    TFLog("没有获取到控制器的类型")
    return
}
 //0.3根据控制器类型创建控制器
let vc = childVCType.init()


//上面通过字符串创建控制器看上去很是蛋疼,但是其实还是有用的。我们可以利用这点要根据json文件去创建控制器。
//0.0.1获取json文件的路径
guard let jsonPath = Bundle.main.path(forResource: "MainVCSettings", ofType: "json") else{

    TFLog("没能获取到json数据")
    return
}
//0.0.2读取json文件中的内容:数组->字典,要按照读取字符串的方法来读取
guard let jsonData = NSData(contentsOfFile: jsonPath) else{

    TFLog("没有获取到json文件中的数据--jsonData")
    return
}
//0.0.3将NSData类型转换为数组类型,数组以及数组中存放的字典,进行两层校验
guard let anyObject = try? JSONSerialization.jsonObject(with: jsonData as Data, options: .mutableContainers) else{

    TFLog("jsonData转anyObject失败")
    return
}

guard let dictArray = anyObject as? [[String :AnyObject]] else{

    TFLog("anyObject转字典数组失败")
    return
}

for dict in dictArray{

    TFLog("---------------")
    TFLog(dict)
}

注意:想要拿到类的名称创建控制器要加上命名空间

你可能感兴趣的:(iOS)