2016-08-24 52 views
1

我遇到了問題,我在UIViewController類中有一個UIButton,我想在另一個文件中的UIView類中發生動畫之後啓用該按鈕。來自UIView中的UIViewController的Swift Call組件

class MainViewController: UIViewController { 
    @IBOutlet weak var nextButton: UIButton! 

    @IBAction func nextButtonPressed(sender: UIButton) { 
     nextButton.enable = false 
    } 
} 

當我嘗試動畫完成後,我得到這個錯誤從viewController類調​​用nextButton

EXC_BAD_INSTRUCTION(code = EXC_I386_INVOP, subcode = 0x0)

我得到的,我設置的Next按鈕使真行錯誤。

class CustomView: UIView { 
    var vc = MainViewController() 

    func animationEnded() { 
     vc.nextButton = true 
    } 
} 

我不知道我在想什麼,我希望得到一些幫助。由於

+0

什麼是完整的,人類可讀的錯誤信息?哪一行正是導致錯誤? – rmaddy

+0

致命錯誤:在解包可選值時意外發現nil。我得到animationEnded函數 –

+0

的錯誤maddy:這真的是一個更深層次的問題,值得單獨回答,關於跨不同風險投資的溝通 – BaseZen

回答

0

你因爲在遇到錯誤的CustomView您創建一個新的MainViewController,你不使用一個從故事板初始化。新的MainViewController沒有任何屬性初始化,因此nextButton爲零,因此當您嘗試訪問它時會崩潰。

你想要做的是從動畫結束的視圖通知你的控制器,以便控制器可以更新按鈕(因爲控制器擁有按鈕)。可可這樣做的標準方法是使用像這樣的代理模式:

class MainViewController: UIViewController, CustomViewDelegate 
{ 
    @IBOutlet weak var nextButton: UIButton! 
    @IBOutlet weak var customView: CustomView! 

    @IBAction func nextButtonPressed(sender: UIButton) { 
     self.nextButton.enabled = false 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     self.customView.delegate = self 
    } 

    func customViewAnimationDidEnd(customView: CustomView) { 
     self.nextButton.enabled = true 
    } 
} 

protocol CustomViewDelegate : class 
{ 
    func customViewAnimationDidEnd(customView: CustomView) 
} 

class CustomView: UIView 
{ 
    weak var delegate: CustomViewDelegate? = nil 

    func animationEnded() { 
     self.delegate?.customViewAnimationDidEnd(self) 
    } 
} 

在此實現控制器的觀點代表和當有趣的事件在視圖中發生(如特定動畫結束)被通知。

0

讓你的UIView的委託,告訴當它應該在CustomView類hapen

protocol CustomViewDelegate { 
    func pushThatButton() 
} 

把這個:

weak var delegate: CustomViewDelegate? 

然後

func animationEnded() { 
    delegate.pushThatButton() 
} 

,並在UIViewController中

class MainViewController: UIViewController, CustomViewDelegate { 

和實施委託OFC

func pushThatButton() 
    nextButton.sendActionsForControlEvents(.TouchUpInside) 
} 

幾乎忘了,做一個出口到的viewController和設置代表你的觀點!在viewDidLoad中(),或者當你會發現這個最好的

customViewOutlet.delegate = self