【问题标题】:Swift 3: UITabBarController error: '*** -[__NSArray0 objectAtIndex:]: index 1 beyond bounds for empty NSArray'Swift 3:UITabBarController 错误:'*** -[__NSArray0 objectAtIndex:]:索引 1 超出了空 NSArray 的范围'
【发布时间】:2017-04-02 00:12:53
【问题描述】:

我创建了一个自定义标签栏控制器。我已经通过 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

    }
}

【问题讨论】:

    标签: swift swift3 uikit uitabbarcontroller uitabbar


    【解决方案1】:

    我注意到一件事:

    let secondItemView = self.tabBar.subviews[1]
    

    AnimatedTabBarController.viewDidLoad() 的第一行。但是,直到 rightCustomTabBarController.viewDidLoad() 之后才设置标签栏控制器。我想你会想在你的 init 方法中初始化包含的视图控制器。

    【讨论】:

    • 你的评论让我有点吃惊。我是 swift 的新手。你能举个例子吗?我真的很感激。谢谢你,先生。
    • 正是那条线。我只是将两个 uitabbar 控制器合二为一,并确保在添加实际的选项卡项和控制器后运行您上面提到的行。干杯!
    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多