Работя по проект със Swift и Storyboards. Това е проект за преобразуване от традиционен IB и Objective-C проект. Имам проблем с UITableView, създаващ екземпляр, когато изгледът е зареден. Нека обясня.
Проектът е навигационен проект. Ето преглед на Storyboard.
Първият viewController на Storyboard е HomeViewController и е целева страница, която показва обща информация. Следващият VC се нарича FeedViewController показва редица RSS канали. Можете да видите разширена екранна снимка на NavigationController, HomeViewController и FeedViewController на снимката по-долу.
Проблемът ми е, че не мога да накарам tableView да Instantiate. Първо проверих, за да се уверя, че моят tableView е свързан като изход и че свойствата dataSource и делегат са свързани. Можете да видите това на снимката по-долу.
В моя клас FeedViewController имам свойство Outler, наречено feedsTableView. Можете да видите декларацията в кода по-долу.
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, което възнамерявам да използвам, за да получа достъп до feedsTableView на FeedViewController.
class HomeViewController: UIViewController, FLODataHandlerDelegate, MFMailComposeViewControllerDelegate
{
// View Contoller and Protocol Properties
var feedViewController : FeedViewController?
var dataHandler : FLODataHandler?
Когато се извика методът viewDidLoad() на HomeViewController, стартирам 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
}
Също така имам защита при отказ, че ако някой отиде до FeedViewController преди методът setUpDataHandler() да бъде извикан, тогава инстанцирам 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 не се инстанцира. В метода viewDidLoad() на FeedViewController се опитвам да добавя 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!)
}
Когато приложението се стартира, получавам следната грешка.
фатална грешка: неочаквано намерена нула при разопаковане на незадължителна стойност
Изображението по-долу показва как се нарича това. Това е viewDidLoad() на FeedViewController. Както можете да видите на снимката, дори се опитах да инстанцирам feedsTableView, преди да го добавя към UIRefreshController и все още получавам грешката.
Всяка помощ ще бъде високо оценена.
Пази се,
Джон