【发布时间】:2014-11-16 15:40:02
【问题描述】:
我正在使用情节提要在 Xcode 6 GM 中快速开发应用程序。在我的视图控制器上,如果我拖放任何视图并将其与相关视图控制器文件中的 IBOutlet 连接,则该插座在 viewDidLoad 中始终为零,并且如果我尝试与该插座进行交互(例如更改按钮的标题),我总是会收到 BAD_INSTRUCTION 错误或其他任何东西,因为该引用的出口始终为零,我不明白为什么..我已经检查了故事板上的视图控制器是否由自定义类选项下身份检查器中的视图控制器文件拥有..这是Xcode和某人的问题否则会遇到同样的问题还是我做错了什么?
编辑 1:
这是第一个启动的视图控制器
import UIKit
类视图控制器: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 插座和自定义单元格的视图控制器
import UIKit
类 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,并且我的出口表视图在 viewDidLoad 中始终为零,然后我尝试使用 ViewController 中按钮的“触发的 Segues”操作来推送 TableViewController(视图中的 ViewController仅包含 4 个按钮,呈现所有呈现 TableViewController 的 segues 动作。没什么特别或奇怪的)并且 tableview 开始被初始化,然后我注释掉了 tableview 的 init 方法和委托设置(委托和数据源已经在情节提要中设置(
【问题讨论】:
-
你能发布你的代码吗?
-
我已经更改了我的代码。首先我使用 'code'presentViewController(vc, animated: true, completion: nil)'code' 以编程方式推送 viewcontroller,现在我添加了一个操作单击按钮推动segue,现在我的tableview插座已初始化,而不是nil,但现在的问题是我的tableview的自定义单元格只有在我使用xib文件来定义单元格布局而不是与直接在情节提要的 tableview 上定义的原型单元格及其相关的模型类和相应的插座..
-
我认为如果我使用以编程方式推送视图控制器会出现问题,如果我使用“Triggered Segues”选项,则插座已正确初始化并且我可以与它们进行交互,但表格视图仍然没有显示我的如果已初始化,则自定义单元格事件(从不调用 cellForRowAtIndexPath)
标签: ios uiviewcontroller swift iboutlet xcode6gm