Swift 3: UITabBarController error: '*** -[__NSArray0 objectAtIndex:]: index 1 beyond bounds for empty NSArray'
Swift 3: UITabBarController error: '*** -[__NSArray0 objectAtIndex:]: index 1 beyond bounds for empty NSArray'
我创建了一个自定义标签栏控制器。我已经通过 Storyboard 完成了这个并且工作正常。我现在正试图通过代码实现这一点,没有情节提要,但我一直因为这个错误而崩溃。
'*** -[__NSArray0 objectAtIndex:]: index 1 beyond bounds for empty NSArray'
有人知道问题出在哪里吗?谢谢大家...
import UIKit
class SecondController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
}
}
class ThirdController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
}
}
class AnimatedTabBarController: UITabBarController {
var secondItemImageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
let secondItemView = self.tabBar.subviews[1]
self.secondItemImageView = secondItemView.subviews.first as! UIImageView
self.secondItemImageView.contentMode = .center
}
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
if item.tag == 1 {
//do our animations
self.secondItemImageView.transform = CGAffineTransform.identity
UIView.animate(withDuration: 0.7, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1, options: .curveEaseInOut, animations: { () -> Void in
let rotation = CGAffineTransform(rotationAngle: CGFloat(M_PI_2))
self.secondItemImageView.transform = rotation
}, completion: nil)
}
}
}
class CustomTabBarController: AnimatedTabBarController {
override func viewDidLoad() {
super.viewDidLoad()
let firstController = ThirdController()
let firstNavController = UINavigationController(rootViewController: firstController)
firstNavController.title = "Requests"
firstNavController.tabBarItem.image = UIImage(named: "home_selected")
firstNavController.tabBarItem.tag = 0
let secondController = SecondController()
let secondNavController = UINavigationController(rootViewController: secondController)
secondNavController.title = "Messenger"
secondNavController.tabBarItem.image = UIImage(named: "home_selected")
secondController.tabBarItem.tag = 1
viewControllers = [firstNavController, secondNavController]
tabBar.isTranslucent = false
let topBorder = CALayer()
topBorder.frame = CGRect(x: 0, y: 0, width: 1000, height: 0.5)
topBorder.backgroundColor = UIColor.lightGray.cgColor
tabBar.layer.addSublayer(topBorder)
tabBar.clipsToBounds = true
}
}
我注意到一件事:
let secondItemView = self.tabBar.subviews[1]
在AnimatedTabBarController.viewDidLoad()
的第一行。但是,选项卡栏控制器直到 right 之后才在 CustomTabBarController.viewDidLoad()
中设置。我认为您会希望在 init
方法中初始化包含的视图控制器。
我创建了一个自定义标签栏控制器。我已经通过 Storyboard 完成了这个并且工作正常。我现在正试图通过代码实现这一点,没有情节提要,但我一直因为这个错误而崩溃。
'*** -[__NSArray0 objectAtIndex:]: index 1 beyond bounds for empty NSArray'
有人知道问题出在哪里吗?谢谢大家...
import UIKit
class SecondController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
}
}
class ThirdController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
}
}
class AnimatedTabBarController: UITabBarController {
var secondItemImageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
let secondItemView = self.tabBar.subviews[1]
self.secondItemImageView = secondItemView.subviews.first as! UIImageView
self.secondItemImageView.contentMode = .center
}
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
if item.tag == 1 {
//do our animations
self.secondItemImageView.transform = CGAffineTransform.identity
UIView.animate(withDuration: 0.7, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1, options: .curveEaseInOut, animations: { () -> Void in
let rotation = CGAffineTransform(rotationAngle: CGFloat(M_PI_2))
self.secondItemImageView.transform = rotation
}, completion: nil)
}
}
}
class CustomTabBarController: AnimatedTabBarController {
override func viewDidLoad() {
super.viewDidLoad()
let firstController = ThirdController()
let firstNavController = UINavigationController(rootViewController: firstController)
firstNavController.title = "Requests"
firstNavController.tabBarItem.image = UIImage(named: "home_selected")
firstNavController.tabBarItem.tag = 0
let secondController = SecondController()
let secondNavController = UINavigationController(rootViewController: secondController)
secondNavController.title = "Messenger"
secondNavController.tabBarItem.image = UIImage(named: "home_selected")
secondController.tabBarItem.tag = 1
viewControllers = [firstNavController, secondNavController]
tabBar.isTranslucent = false
let topBorder = CALayer()
topBorder.frame = CGRect(x: 0, y: 0, width: 1000, height: 0.5)
topBorder.backgroundColor = UIColor.lightGray.cgColor
tabBar.layer.addSublayer(topBorder)
tabBar.clipsToBounds = true
}
}
我注意到一件事:
let secondItemView = self.tabBar.subviews[1]
在AnimatedTabBarController.viewDidLoad()
的第一行。但是,选项卡栏控制器直到 right 之后才在 CustomTabBarController.viewDidLoad()
中设置。我认为您会希望在 init
方法中初始化包含的视图控制器。