我正在使用故事板在Xcode 6 GM中使用swift开发应用程序 . 在我的ViewController如果我拖放任何观点,并将其与一个IBOutlet在相关视图 - 控制文件连接时,该插座始终无在viewDidLoad中,我总是得到BAD_INSTRUCTION错误,如果我试图像更改按钮的 Headers 与插座互动或其他任何因为引用的插座总是零,我无法理解为什么..我已经检查了故事板上的viewcontroller是由自定义类选项下的身份检查器中的viewcontroller文件所拥有的 . 这是Xcode和某人的问题否则是同样的问题,或者我做错了什么?
编辑1:
这是第一个启动的viewcontroller
import UIKit
class ViewController:UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let vc = segue.destinationViewController as TableViewController
vc.prepare(/*initializing things..*/)
}
//这是带有我的tableview出口和自定义单元格的viewcontroller
import UIKit
class TableViewController:UIViewController,UITableViewDelegate,UITableViewDataSource {
@IBOutlet var tableView: UITableView!
//this array contains the date to display in cells and in viewDidLoad is correctly initialized with all the right data..
private var toVisualize:[Visualizable] = []
override func viewDidLoad() {
super.viewDidLoad()
/*I need to initialize the tableview even if it's an outlet rightly connected to the storyboard because it's always nil when viewDidLoad is called*/
self.loadArticles()
self.tableView = UITableView(frame: self.tableView.frame, style: UITableViewStyle.Plain)
//navigationController?.hidesBarsOnSwipe = true
self.tableView.delegate = self
self.tableView.dataSource = self
self.tableView.allowsSelection = true
var cell = UINib(nibName: "MyCell", bundle: nil)
/*first I've used a prototype cell defined in the storyboard and a class with the related outlets and all connected in the right way but the result was a blank screen so I've tried to use a xib file to define the layout of my custom cell and the tableview started showing my cells.. but still I can't figure out why the tableview is nil*/
self.tableView.registerNib(cell, forCellReuseIdentifier: "Cell")
//self.tableView.registerClass(CellaTableViewCell.classForCoder(), forCellReuseIdentifier: "Cell")
self.view.addSubview(self.tableView)
self.tableView.reloadData()
// Do any additional setup after loading the view.
}
func prepare(/*preparing function used from first view controller..*/)->()
{
//this func is not changing anything because I've added it later..
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//this function is correctly working and showing the cells when the tableview is initialized
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = self.tableView?.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as MyCell
var toLoad = self.toVisualize[indexPath.row].getVisualizableProperties()
cell.loadItem(toLoad.title, descr: toLoad.descr, date: toLoad.date)
if let URL = toLoad.thumbUrl
{
var image = self.imageCache[URL]
if( image == nil ) {
// If the image does not exist, we need to download it
var imgURL: NSURL = NSURL(string: URL)
// Download an NSData representation of the image at the URL
let request: NSURLRequest = NSURLRequest(URL: imgURL)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!,data: NSData!,error: NSError!) -> Void in
if error == nil {
image = UIImage(data: data)
// Store the image in to our cache
self.imageCache[URL] = image
dispatch_async(dispatch_get_main_queue(), {
if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) as? MyCell {
cellToUpdate.thumbnail?.image = image
}
})
}
else {
println("Error: \(error.localizedDescription)")
}
})
}
else {
dispatch_async(dispatch_get_main_queue(), {
if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) as? MyCell {
cellToUpdate.thumbnail?.image = image
}
})
}
}
return cell
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView!,heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat
{
return 120.0
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.toVisualize.count
}
}
首先,我用presentViewController以编程方式推TablewViewController和我出口的tableview总是在viewDidLoad中零,然后我试图使用的按键“引发塞格斯”行动在我的ViewController推TableViewController(的ViewController在它的观点仅4包含与呈现塞格斯操作按钮,所有在场的TableViewController ..没有什么特别的或奇怪的),并且实现代码如下开始被初始化,然后我注释掉的tableview和委托设置(委托和数据源在故事板已经被设定),但的init方法结果再次是一个空白的屏幕显示什么都没有..我已经双重检查所有与故事板和各种标识符的连接,所以他们都正确设置..无法弄清楚是什么问题
2 回答
我在Xcode 6.1测试版中遇到了同样的问题,最后在从我的
viewDidLoad
方法中删除自定义单元格注册行后,网点停止为零:// Remove this: self.tableView.registerClass( MyTableViewCell.self, forCellReuseIdentifier: "MyIdentifier" )
从故事板实例化并以编程方式将子视图作为子视图添加到另一个视图时工作 .
请尝试引用
viewWillAppear
或viewDidAppear
函数中的控件 .当
viewDidLoad
运行时,您的应用程序赢得't have created the views and controls yet, so it'太早,无法修改其内容 .此外,在您的故事板中,右键单击您的控件,并检查"Referencing Outlets"部分下是否列出了某些内容,并在该行中填充了该圆圈 . (这只是确认你确实有一个绑定到该控件的变量 . )