使用storyboard搭建一个iOS项目
纯代码搭建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
}
}