发生 IBAction 时,Swift addsubview 和应用程序崩溃

Posted

技术标签:

【中文标题】发生 IBAction 时,Swift addsubview 和应用程序崩溃【英文标题】:Swift addsubview and app crash when IBAction occur 【发布时间】:2014-07-26 09:49:26 【问题描述】:

我只是将其他视图控制器的子视图添加到我当前的视图控制器(由 tableview 组成)。当用户按下行时,我添加子视图。

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!)

    var vc: alertVC = alertVC()
    vc.setUpData(Helper.Stored.alertViewWithPlacehlder)
    self.view.addSubview(vc.view)

在那之后,在那个alertVC中,有IBAction。当我按下那个按钮时,我的应用程序崩溃了。我也不知道为什么。我该怎么办?调试中也没有显示任何内容。

@IBAction func cancel(sender: AnyObject)

    NSLog("cancel");

编辑:下面是我在 alertVC 中的代码,哪个视图将添加到我当前的视图中。当我添加带有加载笔尖的子视图时,我收到了这个错误。我该怎么办?

* 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[<_ttc13fastphonecard9contactvc> setValue:forUndefinedKey:]:此类与键 vwTwoBtnWithTitle 的键值编码不兼容。”

import UIKit

class alertVC: UIViewController 

var alertType: NSString = NSString()

@IBOutlet var vwTwoBtnWithTitle: UIView


override func viewDidLoad() 
    super.viewDidLoad()
    setUpInterface()
    // Do any additional setup after loading the view.


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


class func getView() -> alertVC 
    return NSBundle.mainBundle().loadNibNamed("alertVC", owner: nil, options: nil)[0] as alertVC


func setUpInterface()

    self.view.backgroundColor = UIColor (white: 1, alpha: 0.5)
    if(alertType == Helper.Stored.alertViewWithPlacehlder)
    
        addVWTwoBtnWithTitle()
    


func setUpData(input : NSString)

    alertType = input


func addVWTwoBtnWithTitle()

    vwTwoBtnWithTitle.frame = CGRectMake(20, 190, 280, 160);
    vwTwoBtnWithTitle.layer.borderWidth = 1
    vwTwoBtnWithTitle.layer.borderColor = UIColor.blackColor().CGColor
    vwTwoBtnWithTitle.layer.cornerRadius = 5
    self.view.addSubview(vwTwoBtnWithTitle)



@IBAction func cancel(sender: AnyObject)

    NSLog("cancel");




【问题讨论】:

谢谢。我已从 SWIFT 更改为 Swift 【参考方案1】:

您不应该这样做。将其他 viewControllers 的视图添加为子视图是非常错误的做法。每个 ViewController 都应该管理自己的视图和自己的生命周期。

有两种方法可以做到:

1) 在两个视图控制器中使用Xib 获取您需要的视图,并在需要时加载xib。使用properties 来回传递数据并委托。

2)使用ViewController Containers。使用viewControllers会更合适,它们管理和结构化代码很好。

每个 viewController 都应该管理自己的视图,如果您需要另一个 viewController,您应该展示或导航该 ViewController(如果相关)。每个 ViewController 都有自己的生命周期。

适用于 Xib

创建新的 Xib 并创建新的 file 在您的情况下是视图的子类 AlertView 比加载视图 重要:转到 xib -> Identity Inspector -> Custom Class 部分并将Class 设置为AlertView

     var nib:Array = NSBundle.mainBundle().loadNibNamed("View", owner: self, options: nil) //View is name of  xib 
      var view = nib[0] as? AlertView
     self.view.addSubview(view)  //this will add subview of current viewController

【讨论】:

谢谢。我这样添加。 var nib:Array = NSBundle.mainBundle().loadNibNamed("alertVC", owner: self, options: nil) var vc = nib[0] as? alertVC self.view.addSubview(vc?.view)。但是,如我的问题所示(在编辑中),我遇到了错误。我该怎么办? 哦..我做错了。我喜欢这样。然后,没关系。 var vc = alertVC(nibName: "alertVC", bundle: nil) vc.setUpData(Helper.Stored.alertViewWithPlacehlder) self.view.addSubview(vc.view)。 在我的 alertVC 中,我也需要写这个。 init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 编辑答案:将alertVC(它应该是视图的子类)作为类和self.view.addSubview(vc)放在xib中。寻找编辑答案

以上是关于发生 IBAction 时,Swift addsubview 和应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift标签框高度未正确更新

使用 IBAction 将数据传递到另一个视图控制器而无需 segue swift

Swift - 从 IBAction 按钮调用 SKAction(在类中)

Swift:IBAction 在单击按钮后将图像放入 UIImageView

Swift:编辑模式,将 editButtonItem() 链接到 IBAction

IBAction 显示纬度和经度(swift)