纯代码搭建iOS项目
- 很多老的iOS项目都是用纯代码,大概流程就是项目有几个主要模块就有几个
tabbar item就对应有几个ViewController,具体流程如下:- 将对应的控制器设置属性(设置标题、tabBarItem的默认和选中图片),并且每个都包装一个导航控制器(设置为导航控制器的根控制器);
- 将导航控制器添加为
UITabBarController的子控制器; - 将
UITabBarController设置为UIWindow的根控制器。
class MainViewController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
//添加子控制器
self.addChildViewController(childVc: HomeViewController(), title: "首页", imageName: "tabbar_home")
addChildViewController(childVc: MessageViewController(), title: "消息", imageName: "tabbar_message_center")
addChildViewController(childVc: DiscoverViewController(), title: "发现", imageName: "tabbar_discover")
addChildViewController(childVc: ProfileViewController(), title: "我", imageName: "tabbar_profile")
}
}
// swift支持方法的重载
// 方法的重载:方法名称相同,但是参数不同. --> 1.参数的类型不同 2.参数的个数不同
extension MainViewController{
//设置控制属性并包装导航控制器
private func addChildViewController(childVc: UIViewController, title : String, imageName : String){
// 1.设置子控制器的属性
childVc.title = title
childVc.tabBarItem.image = UIImage(named: imageName)
childVc.tabBarItem.selectedImage = UIImage(named: imageName+"_highlighted")
// 2.包装导航栏控制器
let navVC = UINavigationController(rootViewController: childVc);
// 3.添加控制器
self.addChildViewController(navVC)
}
}
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
UITabBar.appearance().tintColor = UIColor.red
window = UIWindow(frame: UIScreen.main.bounds)
//设置根控制器
window?.rootViewController = MainViewController()
window?.makeKeyAndVisible()
return true
}
可以看出纯代码其实也是很简单的,这里需要注意的是,只要在应用程序启动完成时给window设置了根控制器,不论Main Interface是否设置了storyboard,都是走设置的这个根控制器去。如果想用storyboard搭建项目就不能在AppDelegate启动完成的代理方法中给window添加子控制器。
storyboard搭建iOS项目
- 虽然我自己也觉得用
storyboard搭建iOS项目反而更麻烦,并且xib布局控件对一些复杂或者动态的页面反而更麻烦,但是一些固定简单布局还是挺实用的,而且苹果官方是推荐使用的,所以对于一个iOS开发者来说还是要有所掌握的。 - 效果图
- 具体步骤
1.在project->Target->General->Main Interface选中要首先展示的stroyboard,如下图,选择首先展示的事登录页面Login.storyboard
如果需要在控制器处理一些东就西需要绑定控制器,比如登录要验证用户名,密码,验证码等等,如果仅仅是展示和跳转可以不绑定,直接拉线。
就要勾选is Initial View Controller,表示该控制器作为别的stroyboard跳过来的第一个入口。
2.点击登录后就进入首页,在Main.storyboard中拖入一个Tab Bar Controller,删掉自带的子控制器,添加导航控制器。
绑定一个UITabBarController并且勾选is Initial View Controller
添加子控制器,可以直接拖入Navigation Controller,但是由于区域太小,拖入子控制器很多的话展示连线的比较凌乱,所以可以拖入Storyboard Reference这个专门引用Storyboard的控件。
绑定对应的storyboard即可以,然后连线选择view controller
3.包装导航控制器,设置根控制器属性,拖入Navigation Controller,默认根控制器是Tab View Controller,可以根据需求删除跟换成自己想要的根控制器。这里的连线要选择root view controller,需要绑定和初始化控制器,注意这里绑定是根控制器,不是导航控制器。
给导航控制器添加Tab Bar Item,注意这个Item也可以添加Tab Bar Controller上,但推荐设置到导航控制器上,一般谁是Tab Bar Controller子控制器就添加到谁上。
设置Tab Bar Item的属性,Badge、Title、image、Select Image等
上面storyboard都设置完成了,Main Interface设置为Login.storyboard,即应用程序启动完成加载的是登录页面,登录完成后才展示首页,点击登录按钮登录成功进入首页:
class LoginViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func login(_ sender: Any) {
//要获取单独控制器所在的UIStoryboard
let mainsb = UIStoryboard.init(name: "Main", bundle: nil)
//获取对应绑定的控制器
let mainvc = mainsb.instantiateInitialViewController()
UIApplication.shared.keyWindow?.rootViewController = mainvc
}
}
到此使用storyboard搭建一个登录到登录首页的一个基本框架就完成了。
- 这里有一些注意点:
-
storyboard可以拖入多个控制器控件,但至少有一个控制器,主要用来初始化控制器的,而xib则主要用来初始化示图的如UIView、UITableView等。 -
storyboard中的控制器控件如果想做一些其他的操作,如数据出来、逻辑处理,可以绑定对应类型的控制器。 -
is Initial View Controller表示别的storyboard跳过来的对应的第一个控制器(有多个控制器时),及一个入口,必须有且只有一个被勾选。 - 由于
storyboard主要是设置控制器之间的关系,在控制器控件之间连线时,一定要选对关系,是跟控制器,还是子控制器,还是push等,一定不要连接错。
swift中使用xib自定义view
1.绑定名称
2.通过xib初始化自定英view
class VisitorView: UIView {
//提供快速通过xib创建的类方法
static func visitorView() -> VisitorView{
// let bundle = Bundle(for: VisitorView.self)
let nib = UINib(nibName:"VisitorView", bundle: nil)
return nib.instantiate(withOwner: self, options: nil).first as! VisitorView
}
}