Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 单击按钮会使整个应用程序崩溃_Ios_Swift_Uiview_Uibutton_Addtarget - Fatal编程技术网

Ios 单击按钮会使整个应用程序崩溃

Ios 单击按钮会使整个应用程序崩溃,ios,swift,uiview,uibutton,addtarget,Ios,Swift,Uiview,Uibutton,Addtarget,我目前正在构建应用程序的UI,而不使用IB或故事板。我有以下层次结构: 1.ViewController:它是主视图控制器。 2.DroperViewController:它是较低抽屉菜单的视图控制器。 主视图控制器将抽屉视图控制器的视图添加为子视图。 3.添加按钮:这是一个UIButton,通过编程方式创建并添加到DroperViewController的视图中 问题是,如果我单击add按钮,应用程序就会崩溃,在输出中除了(lldb)之外,绝对不会给出任何错误消息 我尝试了以下方法: 更改选择

我目前正在构建应用程序的UI,而不使用IB或故事板。我有以下层次结构: 1.ViewController:它是主视图控制器。 2.DroperViewController:它是较低抽屉菜单的视图控制器。 主视图控制器将抽屉视图控制器的视图添加为子视图。 3.添加按钮:这是一个UIButton,通过编程方式创建并添加到DroperViewController的视图中

问题是,如果我单击add按钮,应用程序就会崩溃,在输出中除了(lldb)之外,绝对不会给出任何错误消息

我尝试了以下方法:

  • 更改选择器名称和方法名称
  • 选中选择器方法的名称
  • 添加和删除选择器方法的参数
  • 更改了按钮的名称
  • 在另一个视图中添加了按钮 无法使用断点跟踪bug,因为应用程序正在编译,只有单击该按钮应用程序才会崩溃

    这里有一个指向我创建的测试项目的链接,以显示问题:

    视图控制器:

    class ViewController: UIViewController //, DrawerDelegate
    {
    
    //Lower Drawer.
    var drawerView: DrawerView!
    
    var drawerViewHidden: Bool = false
    var addButton: UIButton!
    var viewHeight: CGFloat! = 0
    var viewWidth : CGFloat! = 0
    var shownDrawerViewY: CGFloat!
    var hiddenDrawerViewY: CGFloat!
    
    init()
    {
        super.init(nibName: nil, bundle: nil)
    }
    
    required init(coder aDecoder: NSCoder)
    {
        super.init(coder: aDecoder)
    }
    
    
    
    override func viewDidLoad()
    {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //Setup UI
        setUpUI()
    }
    
    override func viewWillAppear(animated: Bool)
    {
        super.viewWillAppear(animated);
    
    
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    
    //MARK:- UI initialization.
    /**
    Private function that setsup the UI.
    */
    private func setUpUI()
    {
        setUpDrawer()
    }
    
    //MARK: Drawer setup.
    
    /**
    A private function that programatically creataes a drawer and add it to the view.
    */
    private func setUpDrawer()
    {
        var controller = DrawerViewController(width: self.view.frame.width, height: self.view.frame.height)
    
        self.view.addSubview(controller.view)
        //Hide
        // toggleDrawer()
    }
    
    
    
    //MARK:- Delegates.
    
    //MARK: DrawerDelegate methods.
    func addButtonClicked(sender: UIButton)
    {
        //  toggleDrawer()
    }   
    }
    
    抽屉式遥控器

    class DrawerViewController: UIViewController
    {
        //Drawer variables.
        var drawerViewHidden: Bool = false
        var addPinDrawer: AddPinDrawer!
    
    
    
        var viewHeight: CGFloat! = 0
        var viewWidth : CGFloat! = 0
        var shownDrawerViewY: CGFloat?
        var hiddenDrawerViewY: CGFloat?
    
        var addButton: UIButton?
    
        init(width: CGFloat, height: CGFloat)
        {
            super.init(nibName: nil, bundle: nil)
    
            viewWidth  = width
            viewHeight = height
    
            setUpUI()
        }
    
        override func viewDidLoad()
        {
            super.viewDidLoad()
    
            // Do any additional setup after loading the view.
    
        }
    
        override func viewWillAppear(animated: Bool)
        {
            super.viewWillAppear(animated)
    
    
        }
    
        override func didReceiveMemoryWarning()
        {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
    
        required override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)
        {
            super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        }
    
        required init(coder aDecoder: NSCoder)
        {
            fatalError("init(coder:) has not been implemented")
        }
    
    
        //MARK:- UI setup
         func setUpUI()
        {
            setUpDimensions()
            setUpDrawerElements()
    //        toggleDrawer()
        }
    
         func setUpDimensions()
        {
            //Determine the y in the case drawer is shown
            shownDrawerViewY  = viewHeight * 2.0/8.0
    
            //Determine the height of the drawer.
            let drawerHeight = viewHeight * 6.0/8.0
    
            //Determine the y in the case drawer is hidden
            hiddenDrawerViewY = viewHeight * 7.4/8.0
    
            //Create the frame, starting with the drawer shown.
            let frame = CGRectMake(0, shownDrawerViewY!, viewWidth, drawerHeight)
            //Create a new Drawer View.
            self.view = UIView(frame: frame)
    
            setUpAddButton(frame)
    
    
    
            //Setup the background image of the drawer.
            self.view.backgroundColor = UIColor(patternImage: UIImage(named: Constants.drawerBackgroundImage)!)
        }
    
        func setUpDrawerElements()
        {
            //Setup the button.
            setUpAddPinDrawer()
        }
    
        func setUpAddPinDrawer()
        {
            addPinDrawer = AddPinDrawer(frame: CGRectMake(0, 0, self.view.frame.width, self.view.frame.height))
    //        self.view.addSubview(addPinDrawer)
        }
    
    
    
        //MARK: Handling drawer toggles
        func toggleDrawer()
        {
            //Toggle the variable.
            drawerViewHidden = !drawerViewHidden
    
            //If the drawer must be hidden.
            if drawerViewHidden
            {
                hideDrawer()
            }
    
            //If the drawer must be shown
            else
            {
                showDrawer()
            }
        }
    
        func hideDrawer()
        {
            //Hide the drawer
            UIView.animateWithDuration(0.6, animations: { () -> Void in
                self.view.frame.origin.y = self.hiddenDrawerViewY!
            })
          //  drawerView.hideDrawer()
        }
    
        func showDrawer()
        {
            UIView.animateWithDuration(0.6, animations: { () -> Void in
                self.view.frame.origin.y = self.shownDrawerViewY!
            })
          //  drawerView.showDrawer()
        }
    
    
        func setUpAddButton(frame: CGRect!)
        {
            //Determine the button dimensions.
            let width:CGFloat = 75.0//1.0/10.0 * viewHeight
            let x = frame.width/2.0 - width/2.0
    
            //Button background image.
            let background = UIImage(named: Constants.addButtonBackgroundImage)!
    
            //Create the button.
            addButton = UIButton(frame: CGRectMake(x, -width/2.0, width, width)) as UIButton
    //        addButton!.setImage(background, forState: UIControlState.Normal)
    
            addButton?.backgroundColor = UIColor.yellowColor()
    
            //Add the event handler.
            addButton!.addTarget(self, action: "buttonAdd:", forControlEvents: .TouchUpInside)
    
    
            //Set it rotated.
    //        self.addButton!.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_4))
    
    
            //Add the button to the subview.
            self.view.addSubview(addButton!)
    
    //        println(addButton!.targetForAction("test", withSender: addButton)!)
        }
    
        func buttonAdd(sender: UIButton)
        {
            println("Helloooo asdf")
        }
    }
    

    我已经解决了这个问题。在启动DrawerViewController时有一个很小的错误,在主视图控制器中,我创建了一个名为DrawerViewController的变量并启动它的视图。此变量将在方法完成后解除分配,这意味着不会处理所有事件。由于没有处理按钮事件的方法,导致应用程序崩溃

    解决方案:


    将DroperViewController设置为实例变量,并在主视图控制器中对其进行初始化

    您的
    DrawerViewController
    也在故事板中?尝试
    fatalError(“init(coder:)尚未实现”)
    init(coder)中的行到
    super.init(coder:aDecoder)
    是否设置了断点?@VivekMolkar-DrawerViewController不在故事板中,除了viewController类之外,故事板中没有任何内容,并且在故事板中完全为空。所有内容都是通过编程方式添加的。@nhgrif正如我在文章中提到的,设置断点是没有用的,因为应用程序编译得非常好,只有当你点击一个按钮时应用程序才会崩溃。我是问你是否设置了一个断点来阻止显示错误消息(从而阻止任何人获得任何有用的信息)。看起来您很可能有一个异常断点。如果您努力验证没有设置断点,您的应用程序会一直崩溃,我们会看到一条有用的错误消息。此外,断点和编译完全无关。“只有当你点击一个按钮时应用程序才会崩溃”是一个很好的使用符号断点的机会。看看你的代码,你也可以通过添加
    DrawerViewController
    作为ViewController中的childviewcontroller。在
    ViewController.viewDidLoad
    之后添加
    self.view.addSubview(controller.view)
    添加以下行
    self.addChildViewController(controller)