2015-06-15 88 views
0

我目前正在構建應用程序的UI,而不使用IB或故事板。我有以下層次結構: 1. ViewController:它是主視圖控制器。 2. DrawerViewController:它是下部抽屜菜單的視圖控制器。 主視圖控制器將作爲子視圖添加drawerViewController的視圖。 3.添加按鈕:這是一個創建的UIButton,並以編程方式添加到drawerViewController的視圖。按鈕點擊崩潰整個應用程序

問題是,如果我點擊添加按鈕,應用程序崩潰,除了(lldb)之外,輸出中絕對沒有錯誤消息。

我曾嘗試以下:

  1. 更改選擇的名稱和方法名。
  2. 檢查選擇器方法的名稱。
  3. 添加並刪除了選擇器方法的參數。
  4. 更改了按鈕的名稱。
  5. 在另一個視圖中添加了按鈕。

有沒有辦法追查使用斷點的錯誤,因爲應用程序編譯就好了,如果你點擊按鈕的應用程序只能崩潰。

下面是我創建的顯示問題測試項目鏈接:

GitHub

的ViewController:

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() 
} 
} 

DrawerViewController

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") 
    } 
} 
+0

你的'DrawerViewController'也在故事板? (init(coder :)還沒有實現)')'在init(coder)中的行到'super.init(coder:aDecoder)' –

+0

您是否設置了斷點? – nhgrif

+0

@VivekMolkar DrawerViewController不在故事板中,故事板中除viewController類外沒有任何內容,故事板中完全沒有內容。一切都以編程方式添加。 –

回答

-1

我已經解決了這個問題。啓動DrawerViewController時有一個很小的錯誤,在主視圖控制器中,我創建了一個名爲DrawerViewController的變量並啓動它的視圖。一旦方法完成,這個變量將被釋放,這意味着所有的事件都不會被處理。由於沒有方法來處理按鈕的事件,導致應用程序崩潰。

解決辦法:

充分利用DrawerViewController一個實例變量和在主視圖控制器初始化它。

+0

看看你的代碼,你也可以通過在ViewController中添加'DrawerViewController'作爲childviewcontroller。在'self.view.addSubview(controller.view)'後面的'ViewController.viewDidLoad'中添加如下一行'self.addChildViewController(controller)' –

相關問題