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