使用storyboard搭建一个iOS项目

纯代码搭建iOS项目

  • 很多老的iOS项目都是用纯代码,大概流程就是项目有几个主要模块就有几个tabbar item就对应有几个ViewController,具体流程如下:
    1. 将对应的控制器设置属性(设置标题、tabBarItem的默认和选中图片),并且每个都包装一个导航控制器(设置为导航控制器的根控制器);
    2. 将导航控制器添加为UITabBarController的子控制器;
    3. 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
   }

使用storyboard搭建一个iOS项目
可以看出纯代码其实也是很简单的,这里需要注意的是,只要在应用程序启动完成时给window设置了根控制器,不论Main Interface是否设置了storyboard,都是走设置的这个根控制器去。如果想用storyboard搭建项目就不能在AppDelegate启动完成的代理方法中给window添加子控制器。

storyboard搭建iOS项目

  • 虽然我自己也觉得用storyboard搭建iOS项目反而更麻烦,并且xib布局控件对一些复杂或者动态的页面反而更麻烦,但是一些固定简单布局还是挺实用的,而且苹果官方是推荐使用的,所以对于一个iOS开发者来说还是要有所掌握的。
  • 效果图
    使用storyboard搭建一个iOS项目
  • 具体步骤
    1.在project->Target->General->Main Interface选中要首先展示的stroyboard,如下图,选择首先展示的事登录页面Login.storyboard
    使用storyboard搭建一个iOS项目
    如果需要在控制器处理一些东就西需要绑定控制器,比如登录要验证用户名,密码,验证码等等,如果仅仅是展示和跳转可以不绑定,直接拉线。
    使用storyboard搭建一个iOS项目
    就要勾选is Initial View Controller,表示该控制器作为别的stroyboard跳过来的第一个入口。
    使用storyboard搭建一个iOS项目
    2.点击登录后就进入首页,在Main.storyboard中拖入一个Tab Bar Controller,删掉自带的子控制器,添加导航控制器。
    使用storyboard搭建一个iOS项目
    绑定一个UITabBarController并且勾选is Initial View Controller
    使用storyboard搭建一个iOS项目
    添加子控制器,可以直接拖入Navigation Controller,但是由于区域太小,拖入子控制器很多的话展示连线的比较凌乱,所以可以拖入Storyboard Reference这个专门引用Storyboard的控件。
    使用storyboard搭建一个iOS项目
    绑定对应的storyboard即可以,然后连线选择view controller
    使用storyboard搭建一个iOS项目
    使用storyboard搭建一个iOS项目
    3.包装导航控制器,设置根控制器属性,拖入Navigation Controller,默认根控制器是Tab View Controller,可以根据需求删除跟换成自己想要的根控制器。这里的连线要选择root view controller,需要绑定和初始化控制器,注意这里绑定是根控制器,不是导航控制器。
    使用storyboard搭建一个iOS项目
    给导航控制器添加Tab Bar Item,注意这个Item也可以添加Tab Bar Controller上,但推荐设置到导航控制器上,一般谁是Tab Bar Controller子控制器就添加到谁上。
    使用storyboard搭建一个iOS项目
    设置Tab Bar Item的属性,Badge、Title、image、Select Image
    使用storyboard搭建一个iOS项目
    上面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搭建一个登录到登录首页的一个基本框架就完成了。

  • 这里有一些注意点:
  1. storyboard可以拖入多个控制器控件,但至少有一个控制器,主要用来初始化控制器的,而xib则主要用来初始化示图的如UIView、UITableView等。
  2. storyboard中的控制器控件如果想做一些其他的操作,如数据出来、逻辑处理,可以绑定对应类型的控制器。
  3. is Initial View Controller表示别的storyboard跳过来的对应的第一个控制器(有多个控制器时),及一个入口,必须有且只有一个被勾选
  4. 由于storyboard主要是设置控制器之间的关系,在控制器控件之间连线时,一定要选对关系,是跟控制器,还是子控制器,还是push等,一定不要连接错。

swift中使用xib自定义view

1.绑定名称
使用storyboard搭建一个iOS项目
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
    }
 }