我正在使用Swift和Storyboards开发一个项目。这是来自传统IB和Objective-C项目的转换项目。我在加载视图时实例化UITableView时遇到问题。让我解释。
该项目是一个导航项目。这是情节提要的概述。
故事板的第一个viewController是HomeViewController,并且是一个显示常规信息的登录页面。下一个称为FeedViewController的VC显示了许多RSS feed。您可以在下图中看到NavigationController,HomeViewController和FeedViewController的扩展屏幕截图。
我的问题是我无法使tableView实例化。我首先检查以确保tableView作为插座被连接,并且dataSource和委托属性已连接。您可以在下面的图片中看到它。
在我的FeedViewController类中,我有一个名为feedsTableView的Outler属性。您可以在下面的代码中看到该声明。
class FeedViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, FLODataHandlerDelegate
{
// View Contoller and Protocol Properties
var floView : FLOViewController?
var dataHandler : FLODataHandler?
// Interface and Content Properties
var refreshControl : UIRefreshControl?
// IBOutlets
@IBOutlet weak var feedsTableView: UITableView!
@IBOutlet weak var backgroundImage: UIImageView!
在HomeViewController中,我打算使用FeedViewController属性来访问FeedViewController的feedsTableView。
class HomeViewController: UIViewController, FLODataHandlerDelegate, MFMailComposeViewControllerDelegate
{
// View Contoller and Protocol Properties
var feedViewController : FeedViewController?
var dataHandler : FLODataHandler?
当调用HomeViewController的viewDidLoad()方法时,我启动dataHandler-实例化FeedViewController-并将其设置为我的FeedViewController属性。
override func viewDidLoad()
{
super.viewDidLoad()
// Set up the gesture recognizer to allow for swiping to the feed VC.
let recognizer = UISwipeGestureRecognizer(target: self, action: Selector("goToNext"))
recognizer.direction = UISwipeGestureRecognizerDirection.Left
self.view.addGestureRecognizer(recognizer)
// Start the data handler
self.setUpDataHandler()
}
setUpDataHandler()
func setUpDataHandler()
{
// Intitalize FeedVC for use later in the VC
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("FeedViewController") as! FeedViewController
self.feedViewController = vc
}
我还有一个故障保险,如果有人在调用setUpDataHandler()方法之前先去FeedViewController的话,我也会在这里实例化FeedViewController。
func goToNext()
{
// Grab the feedViewController so it can be pushed onto the stack. Make sure you set up the storyboard identifier.
let feedVC = self.storyboard!.instantiateViewControllerWithIdentifier("FeedViewController") as! FeedViewController
self.feedViewController = feedVC
self.navigationController!.pushViewController(self.feedViewController!, animated: true)
}
但是feedsTableView没有被实例化。在FeedViewController的viewDidLoad()方法中,我尝试将feedsTableView添加到UIRefreshController。
override func viewDidLoad()
{
super.viewDidLoad()
self.refreshControl = UIRefreshControl()
self.refreshControl!.addTarget(self, action: "refreshInvoked:state:", forControlEvents: UIControlEvents.ValueChanged)
// See the note in viewDidLoad in FLOViewController.
self.feedsTableView.addSubview(self.refreshControl!)
}
应用运行时,出现以下错误。
致命错误:解开Optional值时意外发现nil
下图显示了这种情况。这是FeedViewController的viewDidLoad()。如您在图片中看到的,我什至在将feedsTableView添加到UIRefreshController之前尝试实例化feedsTableView,但仍然收到错误。
任何帮助将不胜感激。
照顾自己,
乔恩
最佳答案
在最后一种情况(您手动实例化UITableView并将其分配给self.feedsTableView
)的情况下,它不起作用的原因是self.feedsTableView
被声明为weak
。因此,由于没有内存管理功能,因此该表视图已经存在,被分配并消失了。到最后一行时,self.feedsTableView
再次为nil
。
因此,最后一种情况的解决方案是从weak
声明中删除feedsTableView
指定。
在最后一种情况下,这将使您摆脱崩溃。但是当然您不会看到任何东西,因为您也没有将表视图插入界面中。
关于swift - Storyboard UIView对象未实例化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30694744/