我想推出另一个与iPad相关的故事板,但是当我运行代码时,我将收到致命错误
这是我的代码
class pageVC : UIPageViewController , UIPageViewControllerDataSource , UIPageViewControllerDelegate {
let pageVC = UIPageControl()
lazy var VCArr : [UIViewController] = {
return [self.VCInstance(name : "FirtsVC"),
self.VCInstance(name : "SecondVC"),
self.VCInstance(name :"ThirdVC"),
self.VCInstance(name :"FourthVC"),
self.VCInstance(name :"FivethVC")]
}()
private func VCInstance(name : String) -> UIViewController {
let modelName = UIDevice.current.modelName
if modelName == "iPad Mini 3" {
return UIStoryboard(name : "ipadmini" , bundle : nil).instantiateViewController(withIdentifier: name)
}else {
return UIStoryboard(name : "Main" , bundle : nil).instantiateViewController(withIdentifier: name)
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = self
self.delegate = self
let modelName = UIDevice.current.modelName
print(modelName)
if modelName == "iPad Mini 3" {
print("OK")
let mainStoryboard: UIStoryboard = UIStoryboard(name: "ipadmini" , bundle: nil)
let viewController = mainStoryboard.instantiateViewController(withIdentifier: "pageVC")
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = viewController
}
let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore")
if launchedBefore {
print("Not first launch!")
print("Should Launch MainTabBarController!")
} else {
print("First launch, setting UserDefault.")
UserDefaults.standard.set(true, forKey: "launchedBefore")
}
var shouldAutorotate: Bool {
return false
}
var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
UIViewController.attemptRotationToDeviceOrientation()
}
func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return [UIInterfaceOrientationMask.portrait ]
}
if VCArr.first != nil {
print("first Page Reached!")
}
if let firstVC = VCArr.first {
setViewControllers([firstVC] , direction: .forward , animated: true, completion: nil)
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let view = self.pageVC.currentPage
for view in self.view.subviews {
if view is UIScrollView {
let pageVC = UIPageControl()
self.pageVC.pageIndicatorTintColor = UIColor.lightText
self.pageVC.currentPageIndicatorTintColor = UIColor.white
self.pageVC.backgroundColor = UIColor.white
self.pageVC.numberOfPages = VCArr.count
self.pageVC.center = self.view.center
self.view.addSubview(self.pageVC)
pageVC.layer.position.y = self.view.frame.height - 150;
}else if view is UIPageControl{
view.backgroundColor = UIColor.clear
pageVC.numberOfPages = 5
pageVC.center = self.view.center
pageVC.layer.position.y = self.view.frame.height - 100 ;
}
}
}
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?{
guard let viewControllerIndex = VCArr.index(of: viewController) else {
return nil
}
let previousIndex = viewControllerIndex-1
guard previousIndex >= 0 else {
return nil
}
guard VCArr.count > previousIndex else {
return nil
}
return VCArr[previousIndex]
}
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?{
guard let viewControllerIndex = VCArr.index(of: viewController) else {
return nil
}
let nextIndex = viewControllerIndex+1
guard nextIndex < VCArr.count
else {
return nil
}
guard VCArr.count > nextIndex else {
return nil
}
return VCArr[nextIndex]
}
public func presentationCount(for pageViewController: UIPageViewController) -> Int{
return VCArr.count
}
public func presentationIndex(for pageViewController: UIPageViewController) -> Int{
guard let firstViewController = viewControllers?.first , let firstViewControllerIndex = VCArr.index(of: firstViewController) else {
return 0
}
let firstIndex = firstViewControllerIndex - 1
guard firstIndex >= VCArr.count else {
return VCArr.count
}
return firstViewControllerIndex
}
public func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
self.pageVC.currentPage = pageViewController.viewControllers!.first!.view.tag
if(viewControllers!.first?.view.tag == 4 ) {
if (VCArr.last!.isViewLoaded)
{
let modelName = UIDevice.current.modelName
if modelName == "iPad Mini 3" {
print("OK")
let mainStoryboard: UIStoryboard = UIStoryboard(name: "ipadmini" , bundle: nil)
let viewController = mainStoryboard.instantiateViewController(withIdentifier: "FivethVC")
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = viewController
}
else {
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main" , bundle: nil)
let viewController = mainStoryboard.instantiateViewController(withIdentifier: "FivethVC")
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = viewController
print("Last Page Reached!!!")
}
}
}
}
}
public extension UIDevice
{
var modelName: String {
var systemInfo = utsname()
uname(&systemInfo)
let machineMirror = Mirror(reflecting: systemInfo.machine)
let identifier = machineMirror.children.reduce("") { identifier, element in
guard let value = element.value as? Int8 , value != 0 else { return identifier }
return identifier + String(UnicodeScalar(UInt8(value)))
}
switch identifier {
case "iPod5,1":
return "iPod Touch 5"
case "iPod7,1":
return "iPod Touch 6"
case "iPhone3,1", "iPhone3,2", "iPhone3,3":
return "iPhone 4"
case "iPhone4,1":
return "iPhone 4s"
case "iPhone5,1", "iPhone5,2":
return "iPhone 5"
case "iPhone5,3", "iPhone5,4":
return "iPhone 5c"
case "iPhone6,1", "iPhone6,2":
return "iPhone 5s"
case "iPhone7,2":
return "iPhone 6"
case "iPhone7,1":
return "iPhone 6 Plus"
case "iPhone8,1":
return "iPhone 6s"
case "iPhone8,2":
return "iPhone 6s Plus"
case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":
return "iPad 2"
case "iPad3,1", "iPad3,2", "iPad3,3":
return "iPad 3"
case "iPad3,4", "iPad3,5", "iPad3,6":
return "iPad 4"
case "iPad4,1", "iPad4,2", "iPad4,3":
return "iPad Air"
case "iPad5,3", "iPad5,4":
return "iPad Air 2"
case "iPad2,5", "iPad2,6", "iPad2,7":
return "iPad Mini"
case "iPad4,4", "iPad4,5", "iPad4,6":
return "iPad Mini 2"
case "iPad4,7", "iPad4,8", "iPad4,9":
return "iPad Mini 3"
case "iPad5,1", "iPad5,2":
return "iPad Mini 4"
case "iPad6,7", "iPad6,8":
return "iPad Pro"
case "AppleTV5,3":
return "Apple TV"
case "i386", "x86_64":
return "Simulator"
default:
return identifier
}
}}
**当我在iPad mini上运行程序时,我想使用故事板设备和应用程序启动对象iPad迷你故事板**
答案 0 :(得分:0)
ok这是答案
class pageVC : UIPageViewController , UIPageViewControllerDataSource , UIPageViewControllerDelegate {
let pageVC = UIPageControl()
lazy var VCArr : [UIViewController] = {
return [self.VCInstance(name : "FirtsVC"),
self.VCInstance(name : "SecondVC"),
self.VCInstance(name :"ThirdVC"),
self.VCInstance(name :"FourthVC"),
self.VCInstance(name :"FivethVC")]
}()
private func VCInstance(name : String) -> UIViewController {
let modelName = UIDevice.current.modelName
if modelName == "iPad Mini 3" {
return UIStoryboard(name : "ipadmini" , bundle : nil).instantiateViewController(withIdentifier: name)
}else {
return UIStoryboard(name : "Main" , bundle : nil).instantiateViewController(withIdentifier: name)
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = self
self.delegate = self
let launchedBefore = UserDefaults.standard.bool(forKey: "launchedBefore")
if launchedBefore {
print("Not first launch!")
print("Should Launch MainTabBarController!")
let modelName = UIDevice.current.modelName
print(modelName)
if modelName == "iPad Mini 3" {
print("OK")
let mainStoryboard: UIStoryboard = UIStoryboard(name: "ipadmini", bundle: nil)
let viewController = mainStoryboard.instantiateViewController(withIdentifier: "MainTabBarController") as! UITabBarController
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = viewController
}else {
print("Not Ipad mini")
}
if modelName == "iPad Mini 3" {
print("OK")
let mainStoryboard: UIStoryboard = UIStoryboard(name: "ipadmini", bundle: nil)
let viewController = mainStoryboard.instantiateViewController(withIdentifier: "MainTabBarController") as! UITabBarController
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = viewController
}else {
/////Not First Time launch! reach mainTabBarController//////////
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = mainStoryboard.instantiateViewController(withIdentifier: "MainTabBarController") as! UITabBarController
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = viewController
}
} else {
print("First launch, setting UserDefault.")
UserDefaults.standard.set(true, forKey: "launchedBefore")
}
//////Lock Rotation/////////
var shouldAutorotate: Bool {
return false
}
var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
UIViewController.attemptRotationToDeviceOrientation()
}
func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return [UIInterfaceOrientationMask.portrait ]
}
///////Lock Roration//////
if VCArr.first != nil {
print("first Page Reached!")
}
if let firstVC = VCArr.first {
setViewControllers([firstVC] , direction: .forward , animated: true, completion: nil)
}
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let view = self.pageVC.currentPage
for view in self.view.subviews {
if view is UIScrollView {
let pageVC = UIPageControl()
self.pageVC.pageIndicatorTintColor = UIColor.lightText
self.pageVC.currentPageIndicatorTintColor = UIColor.white
self.pageVC.backgroundColor = UIColor.white
self.pageVC.numberOfPages = VCArr.count
self.pageVC.center = self.view.center
self.view.addSubview(self.pageVC)
pageVC.layer.position.y = self.view.frame.height - 150;
}else if view is UIPageControl{
view.backgroundColor = UIColor.clear
pageVC.numberOfPages = 5
pageVC.center = self.view.center
pageVC.layer.position.y = self.view.frame.height - 100 ;
}
}
}
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?{
guard let viewControllerIndex = VCArr.index(of: viewController) else {
return nil
}
let previousIndex = viewControllerIndex-1
guard previousIndex >= 0 else {
return nil
}
guard VCArr.count > previousIndex else {
return nil
}
return VCArr[previousIndex]
}
public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?{
guard let viewControllerIndex = VCArr.index(of: viewController) else {
return nil
}
let nextIndex = viewControllerIndex+1
guard nextIndex < VCArr.count
else {
return nil
}
guard VCArr.count > nextIndex else {
return nil
}
return VCArr[nextIndex]
}
public func presentationCount(for pageViewController: UIPageViewController) -> Int{
return VCArr.count
}
public func presentationIndex(for pageViewController: UIPageViewController) -> Int{
guard let firstViewController = viewControllers?.first , let firstViewControllerIndex = VCArr.index(of: firstViewController) else {
return 0
}
let firstIndex = firstViewControllerIndex - 1
guard firstIndex >= VCArr.count else {
return VCArr.count
}
return firstViewControllerIndex
}
public func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
self.pageVC.currentPage = pageViewController.viewControllers!.first!.view.tag
if(viewControllers!.first?.view.tag == 4 ) {
if (VCArr.last!.isViewLoaded)
{
let modelName = UIDevice.current.modelName
if modelName == "iPad Mini 3" {
print("OK")
let mainStoryboard: UIStoryboard = UIStoryboard(name: "ipadmini" , bundle: nil)
let viewController = mainStoryboard.instantiateViewController(withIdentifier: "FivethVC")
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = viewController
}
else {
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main" , bundle: nil)
let viewController = mainStoryboard.instantiateViewController(withIdentifier: "FivethVC")
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = viewController
print("Last Page Reached!!!")
}
}
}
}
}
public extension UIDevice {
var modelName: String {
var systemInfo = utsname()
uname(&systemInfo)
let machineMirror = Mirror(reflecting: systemInfo.machine)
let identifier = machineMirror.children.reduce("") { identifier,element in
guard let value = element.value as? Int8 , value != 0 else { return identifier }
return identifier + String(UnicodeScalar(UInt8(value)))
}
switch identifier {
case "iPod5,1":
return "iPod Touch 5"
case "iPod7,1":
return "iPod Touch 6"
case "iPhone3,1", "iPhone3,2", "iPhone3,3":
return "iPhone 4"
case "iPhone4,1":
return "iPhone 4s"
case "iPhone5,1", "iPhone5,2":
return "iPhone 5"
case "iPhone5,3", "iPhone5,4":
return "iPhone 5c"
case "iPhone6,1", "iPhone6,2":
return "iPhone 5s"
case "iPhone7,2":
return "iPhone 6"
case "iPhone7,1":
return "iPhone 6 Plus"
case "iPhone8,1":
return "iPhone 6s"
case "iPhone8,2":
return "iPhone 6s Plus"
case "iPhone9,1", "iPhone9,3":
return "iPhone 7"
case "iPhone9,2", "iPhone9,4":
return "iPhone 7 Plus"
case "iPhone8,4":
return "iPhone SE"
case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":
return "iPad 2"
case "iPad3,1", "iPad3,2", "iPad3,3":
return "iPad 3"
case "iPad3,4", "iPad3,5", "iPad3,6":
return "iPad 4"
case "iPad4,1", "iPad4,2", "iPad4,3":
return "iPad Air"
case "iPad5,3", "iPad5,4":
return "iPad Air 2"
case "iPad2,5", "iPad2,6", "iPad2,7":
return "iPad Mini"
case "iPad4,4", "iPad4,5", "iPad4,6":
return "iPad Mini 2"
case "iPad4,7", "iPad4,8", "iPad4,9":
return "iPad Mini 3"
case "iPad5,1", "iPad5,2":
return "iPad Mini 4"
case "iPad6,3", "iPad6,4", "iPad6,7", "iPad6,8":
return "iPad Pro"
case "AppleTV5,3":
return "Apple TV"
case "i386", "x86_64":
return "Simulator"
default:
return identifier
}
}}