2

我正在使用情节提要在 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 中按钮的“Triggered Segues”操作来推送 TableViewController(视图中的 ViewController 仅包含 4按钮呈现所有呈现 TableViewController 的 segues 动作.. 没有什么特别或奇怪的)并且 tableview 开始被初始化,然后我注释掉了 tableview 的 init 方法和委托设置(委托和数据源已经在情节提要中设置)但是结果又是一个空白屏幕,什么也没有显示。我已经仔细检查了所有与情节提要和各种标识符的连接,所以它们都正确设置了。不知道是什么问题

4

2 回答 2

1

viewDidLoad我在 Xcode 6.1 beta 中遇到了同样的问题,最后在从我的方法中删除自定义单元注册行后,出口停止为零:

// Remove this: self.tableView.registerClass( MyTableViewCell.self, forCellReuseIdentifier: "MyIdentifier" )

从故事板实例化并以编程方式将子视图作为子视图推送或添加到另一个视图时工作。

于 2014-09-26T08:37:22.473 回答
0

该插座在 viewDidLoad 中始终为零,如果我尝试与该插座交互(例如更改按钮的标题或其他任何内容),我总是收到 BAD_INSTRUCTION 错误,因为引用的插座始终为零,我不明白为什么

尝试在viewWillAppearorviewDidAppear函数中引用控件。

运行时viewDidLoad,您的应用还没有创建视图和控件,因此修改它们的内容还为时过早。

此外,在您的 Storyboard 中,右键单击您的控件,并检查您是否在“引用插座”部分下列出了某些内容,并在该行上填充了圆圈。(这只是确认您确实有一个绑定到该控件的变量。)

在此处输入图像描述

于 2015-06-19T11:59:58.640 回答