Ios 创建UIAlertView的第二次调用时UIView崩溃
我在自定义视图中遇到了一个奇怪的崩溃。它是一个简单的调试面板,带有一个按钮,用于创建UIAlertView以获取字符串。XIB将UIButton链接到clickInside上的iAction,UITextView通过outlet链接到mDebugText 视图控制器在第一次一切正常时实例化视图。我可以按下按钮,Alertview弹出,我可以键入并关闭它。没问题 但是,如果my view controller删除/销毁了DebugView,并在按下按钮后创建了一个新的DebugView,则应用程序将因EXC_BAD_访问而崩溃。我已经去掉了所有无关的代码,现在这是UIAlertView上没有委托的裸机,在第二次创建视图并按下按钮时,它仍然崩溃 如果我不切换视图,我可以按下按钮,取消警报,然后按任意次数 如果您对可能出现的问题有任何意见,我们将不胜感激Ios 创建UIAlertView的第二次调用时UIView崩溃,ios,iphone,swift,ios7,Ios,Iphone,Swift,Ios7,我在自定义视图中遇到了一个奇怪的崩溃。它是一个简单的调试面板,带有一个按钮,用于创建UIAlertView以获取字符串。XIB将UIButton链接到clickInside上的iAction,UITextView通过outlet链接到mDebugText 视图控制器在第一次一切正常时实例化视图。我可以按下按钮,Alertview弹出,我可以键入并关闭它。没问题 但是,如果my view controller删除/销毁了DebugView,并在按下按钮后创建了一个新的DebugView,则应用程序
class DebugView : BaseView,UIAlertViewDelegate {
@IBOutlet weak var mDebugText: UITextView!
var mDelegate:DebugViewDelegate? = nil
var mMessage: String = ""
class func instanceFromNib(delegate:DebugViewDelegate? = nil) -> DebugView {
let view = UINib(nibName: "DebugView", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! DebugView
view.refreshDisplay()
view.mDelegate = delegate
return view
}
override func refreshDisplay() {
var debug:String = ""
debug += "STATUS:" + mMessage + "\n\n"
debug += "\n--END--"
mDebugText.text = debug
}
@IBAction func onSelectEnterScan(sender: AnyObject) {
var alertView:UIAlertView = UIAlertView(title: "Fake Scans", message: "Enter Scan Detail", delegate: nil, cancelButtonTitle: "Cancel", otherButtonTitles: "OK")
alertView.alertViewStyle = UIAlertViewStyle.PlainTextInput;
alertView.show()
}
}
崩溃发生在alertView.show()行。ViewController代码如下所示,许多不同的视图使用viewTransition在各种不同的视图中进行滑动/翻转,它们都可以正常工作:
func onSelectDebug(animation:AnimationType) {
if isUILocked() { return }
setNavCurrent(Constants.NAVIGATOR_DEBUG)
let newView:BaseView = DebugView .instanceFromNib(delegate: self)
newView.frame=CGRect(x: 0, y: 0, width: mMainHolder.frame.size.width, height: mMainHolder.frame.size.height);
viewTransition(newView, animation:animation)
}
func onSelectHome(animation:AnimationType) {
if isUILocked() { return }
setNavCurrent(Constants.NAVIGATOR_HOME)
let newView:BaseView = HomeView.instanceFromNib(delegate: self)
newView.frame=CGRect(x: 0, y: 0, width: mMainHolder.frame.size.width, height: mMainHolder.frame.size.height)
viewTransition(newView, animation:animation)
}
viewTransition函数执行UIView.animateWithDuration以滑出旧视图,并与新视图一起滑入,添加新视图,动画完成,完成后,旧视图从superview中删除,不再被引用。因此,如果我导致onSelectDebug,调试屏幕将滑入,我按下按钮,获取警报,使用导航导致onSelectHome,主屏幕将滑入,按下按钮导致调用onSelectDebug,调试屏幕将滑入,但我按下新DebugView上的按钮,砰,崩溃和死亡
崩溃详细信息:在主线程中堆栈帧objc_msgSend,EXC_BAD_ACCESS在何处/如何销毁和重新创建调试视图?如果删除以下行:alertView.alertViewStyle=UIAlertViewStyle.PlainTextInput;然后它会工作的很好,但我失去了输入。这确实看起来很奇怪。。。一个解决方法可能是根据需要延迟加载调试视图,然后保留视图,这样就不必重新实例化…如果我保留/回收调试视图,它工作正常,我开始怀疑这可能是一个Swift/ARC错误!!