正式开始iOS学习计划了,还是一如既往的忙,所以都是周末搞了。
周六花了一天时间学习了下iOS,目前感觉良好,这应该归功于某位不知名的童鞋。
这个是他的BLOG http://www.samirchen.com/
下文之所以不按照 ** 入门的套路来写,是我觉得上面这位童鞋已经写得很好了,思路非常清晰,我很难超越,再去写就只能抄袭了。
但是目录结构还是借鉴过来了,在此说明下。
(1)AppStore下载
(2)apple.developer.com官网下载
安装点击下载好的Xcode,按提示操作即可。
以最简单的场景为例,创建一个UIButton,点击UIButton弹出一个提示框。
实现方式有两种:
(1)storyboard方式拖一个UIButton控件到storyboard,并双指轻按弹出提示框,选中Touch Up Inside点击事件,将其拖到ViewController.m代码编辑处,编辑代码即可。具体如下图所示:
(2)自定义View方式纯代码编写。
参考: http://www.samirchen.com/ios-start-1/
iOS中是通过CocoaPods管理库依赖的。
由于 CocoaPods 需要通过 ruby 的 gem 命令下载安装,而 ruby 的软件源 https://rubygems.org 因为使用的是亚马逊的云服务,所以被墙了,可以切换成taobao的源进行安装。
sudo gem sources -a https://ruby.taobao.org/ sudo gem sources -r https://rubygems.org/ sudo gem sources -l sudo gem update sudo gem install -n /usr/local/bin cocoapods -v 0.39 pod setup pod --version 这里我们使用 SVProgressHUD 和 Masonry 。
SVProgressHUD 是一个提示框,类似于 Android 中的 ProgressDialog
Masonry 是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局
在项目根目录下创建Podfile文件,在文件中添加如下配置:
source 'https://github.com/CocoaPods/Specs.git' platform :ios, "8.0" target "iOSStartDemo" do pod 'SVProgressHUD', '1.1.3' pod 'Masonry', '0.6.3' end 然后通过如下命令,安装第三方依赖库:
pod install 安装成功后,在项目根目录下会多出几个文件,我们打开.xcworkspace文件,重新启动工作空间,继续后续操作。
参考: http://www.samirchen.com/ios-start-2/
为啥初学iOS就要考虑目录结构调整呢?
嗯,初学iOS,并不代表基础为0,之前的编码经验是可以灵活借鉴到新技术的学习中来的。
iOS官方使用MVC架构,和 Android 类似。通常一个完整项目由基础功能模块、基础业务模块、各业务模块和资源文件组成,不同业务模块放到不同的包下面,每个业务模块都使用MVC模式。这样耦合会比较少,结构也会很清晰。
如下所示:
学姐在实际操作过程中,尝试了2种方式来调整目录结构:
(1)New Group方式
在Xcode中双指轻按项目主目录,弹出选项框,选中New Group,依次创建业务文件夹。
这种方式能够运行很OK,但是当我去Finder中去查找时,并没有找到我创建的文件夹,所有的文件都在一个目录下,还以为哪里出问题了。对照了下参考的demo,别人的明明就是有文件夹的啊,于是我Google了下,开始尝试方式(2)
(2)创建实体文件夹方式
直接在Finder对应位置创建相应的实体文件夹。
这时在Xcode中能看到对应的文件夹,但是当我开始run时,提示找不到 **ViewController.h ,这个类明明是存在的,检查了好几遍。我比较了下方式(2)和方式(1)的不同,发现方式(2)的文件夹是蓝色的,方式(1)的文件夹是黄色的。捣腾半天,在研究怎么把蓝色变黄,于是又开始Google了,最终找到方法了,直接将Finder中的实体文件夹拖到Xcode中对应位置,然后删掉Xcode中的蓝色文件夹就行了。
运行结果符合预期,而且在Xcode和Finder中都能看到文件夹了,再也不用担心所有业务类堆一起了。
如下分别为效果图:
Android 中有一个很重要的概念: package ,不同业务模块通常放到不同package中的。对某个类的引用,也需要导入这个类所在的包,或者是类名前带上包名。
然而 iOS 中对某个类的引用直接import这个类的头文件即可,如 import **ViewController.h ,并没有包名的说法。
Group 有点类似于 package ,但它只是一个分组,是 Xcode 环境下的虚拟文件夹,并不实际在Finder中能看到。
Finder中创建的实体文件夹,Xcode是不认的。Xcode只认虚拟文件夹,但是通过将Finder中的实体文件夹拖到Xcode对应位置,就能得到虚拟文件夹了,这时候虚拟文件夹和实体文件夹就对应上了。
以下文字为摘抄:
常见的页面容器有 UITabBarController 和 UINavigationController 。
UITabBarController 是通过 数组 的形式管理容器内的所有 UIViewController
UINavigationController 是通过栈的形式管理容器内所有 UIViewController
这两种容器可以嵌套使用,通常 UITabBarController 为主容器, UINavigationController 为辅容器
如下图所示:
入口程序为 MXJAppDelegate ,类似于 Android 中的 Application 类
我又仔细看了下,主目录下有个 main.h 文件,Supporting Files目录下有个 main.m 文件,这两个文件中都调用了 MXJAppDelegate 。嗯,这其实也证实iOS开发语言 Objective-C 是基于 C 语言的,都是以 main 为程序的真正入口。
UITableView 是一个列表View,类似于 Android 中的 ListView 和 RecyclerView
参考: http://www.samirchen.com/ios-start-3/
1.每个类都由 ***.h 和 ***.m 2个文件组成。
Android 中只有 .java 文件
2. main.m 为程序的真正入口,它调用的 AppDelegate 为 Objective-C 代码入口。
对应于 Android 中的 Application
3.创建一个View的方式有两种: storyboard方式 和 代码自定义方式
对应于 Androud 中的 .xml布局 和 代码自定义方式
4.iOS中的库依赖使用的是 CocoaPods
Android中库依赖使用 gradle
5.iOS中没有 package ,只有 Group 概念, Group 是Xcode下的虚拟文件夹,不是实体文件夹。通过在Finder中创建实体文件夹,然后拖到Xcode中对应目录的方法,可以将实体文件夹和虚拟文件夹对应上
Android 中有 package 概念,对类的引用需要 import package
6.初步认识了下 iOS 中几个常用控件:
第三方: SVProgressHUD 和 Masonry
(1) SVProgressHUD 是一个提示框,类似于 Android 中的 ProgressDialog
(2) Masonry 是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局
原生: UIButton , UITableView , UITabBarController , UINavigationController , UIViewController
(1) UIButton 按钮,类似于Android中的 Button
(2) UITableView 列表View,类似于Android中的 ListView 和 RecyclerView
(3) UITabBarController 管理tab的一个控制器
(4) UINavigationController 管理界面导航的控制器,也可以理解为界面路由控制?(个人理解)
(5) UIViewController 管理View的控制器,基础类,它的上级可以是 UITabBarController 和 UINavigationController 等(个人理解)
讲下自己对学习一门新技术的看法,以及个人学习方法:
(1)前提条件:
由于有 Android 开发经验,所以学习新技术iOS时,不是且不能认为自己是0基础
Android 开发者学习 iOS 只是拓宽知识广度,不应该以 iOS 开发者的同等标准要求自己,会简单的iOS App开发,知道一些基本知识即可
(2)学习方法:
边实践边学习。
因为已经有 Android 开发经验,第一步应该是搭建环境,能跑起来一个 Hello World 程序
接下来照着入门教程,做一个简单的小功能,照着例子敲一边即可,熟悉下 Xcode 使用,初步感受下 iOS 程序的结构,初步了解下几个常见的控件。
再接下来,我觉得可以在Github上找个难度适中的 iOS 项目,边学习 Objective-C 语法和 iOS 中的各种控件了
以上对于其他新技术的学习,应该也有一定程度的指导意义
demo
http://www.samirchen.com/ios-index/ http://www.cocoachina.com/ios/20160301/15328.html