2017-12-04 1 views
0

프로그램이 실행되는 동안 tableView을 동적으로 업데이트하려고합니다.tableView.reloadData() 호출시 "치명적인 오류"가 발생하여 tableView가 제대로 연결되었습니다.

보기 컨트롤러 :

여기
fatal error: unexpectedly found nil while unwrapping an Optional value 

는 관련 코드입니다 : 난 내가 self.eventTable.reloadData()를 호출하는 버튼을 누를 때 올바르게에서 데이터로드,하지만 난이 오류가 발생하는 배열을 업데이트 한 생각 이 기능은 때 잘 작동

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


// Add table to keep track of events 
@IBOutlet weak var eventTable: UITableView! 

var eventData = [Session]() 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return eventData.count; 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellReuseIdentifier") as! eventTableViewCell 
    let event = eventData[indexPath.row] 
    cell.eventLabel.text = event.session 
    return cell 
} 

private func loadEvents(event: String) { 
    guard let event1 = Session(session: event) else { 
     fatalError("Unable to instantiate event") 
    } 

    eventData += [event1] 

    DispatchQueue.main.async() { 
     self.eventTable.reloadData() 
    } 
} 

func testPrint() { 
    loadEvents(event: "testing cell adding") 
    //self.eventTable.reloadData() 
    viewWillAppear(false) 
    print("This is a test print"); 
} 

} 

import UIKit 

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

//Timer view 
@IBOutlet weak var playButton: UIBarButtonItem!; 
@IBOutlet weak var pauseButton: UIBarButtonItem!; 
@IBOutlet weak var refreshButton: UIBarButtonItem!; 
@IBOutlet weak var timerLabel: UILabel! 

var counter = 0 
var timer = Timer() 
var isTimerRunning = false 

//testing view container 
var viewShowing = 1; 

override func viewDidLoad() { 

    // Do any additional setup after loading the view, typically from a nib. 
    pauseButton.isEnabled = false 

    hideAll(); 
    self.basicContainer.isUserInteractionEnabled = true; 
    self.basicContainer.isHidden = false; 

    self.timerLabel.text = String("00:00:00"); 

    eventTable.dataSource = self 
    eventTable.delegate = self 

    super.viewDidLoad()   
    loadEvents(event: "timer start") 
} 

... ViewDidLoad()에서 호출되지만 다른 클래스의 단추 ("이것은 테스트 인쇄입니다"라는 메시지가 콘솔에 인쇄되므로 버튼 호출이 처리되고 있음을 알 수 있음)에서 호출 될 때가 아닙니다.

"타이머 시작"및 "셀 추가 테스트"(이상적으로는 "셀 추가 테스트"가 맨 위에 있음)를 나타내는 tableView (eventTable)로드 재실행이 예상됩니다.

eventTable이 스토리 보드에 연결되어 있다는 점을 강조하고 싶습니다. 여기서는 일반적인 문제인 것 같습니다.

Session.swift

import Foundation 
import UIKit 

class Session { 

//MARK: Properties 

var session: String 

//MARK: Initialization 

init?(session: String) { 

    guard !session.isEmpty else { 
     return nil 
    } 

    self.session = session 
} 

} 

eventTableViewCell.swift

import Foundation 
import UIKit 

class eventTableViewCell: UITableViewCell { 
//MARK: Properties 
@IBOutlet weak var eventLabel: UILabel! 

override func awakeFromNib() { 
    super.awakeFromNib() 
} 

override func setSelected(_ selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
    // Configure the view for the selected state 
} 

} 

감사 : 사람들은 도움이되는 경우

다음은 Session.swift 파일과 eventTableViewCell.swift 파일입니다!

편집 : 내가 어디 testPrint() 호출 ViewController.

import UIKit 

class BasicViewController: UIViewController { 

var VC = ViewController(); 


override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

//Basic buttons 
@IBOutlet weak var warmButton: UIButton! 
@IBOutlet weak var dryButton: UIButton! 
@IBOutlet weak var stimulateButton: UIButton! 
@IBOutlet weak var controlButton: UIButton! 
@IBOutlet weak var bedButton: UIButton! 
@IBOutlet weak var tempButton: UIButton! 
@IBOutlet weak var pulseButton: UIButton! 
@IBOutlet weak var ecgButton: UIButton! 
@IBOutlet weak var apgarButton: UIButton! 
@IBOutlet weak var helpButton: UIButton! 

//APGAR options 
@IBOutlet weak var skinColor: UIButton! 
@IBOutlet weak var pulse: UIButton! 
@IBOutlet weak var grimace: UIButton! 
@IBOutlet weak var flexion: UIButton! 
@IBOutlet weak var respiratoryEffort: UIButton! 



@IBAction func warmButton(sender: AnyObject) { 
    VC.testPrint(); 
} 
} 

문제를 일으키는 새로운 ViewController를 인스턴스화한다고 말하는 것이 좋습니다. 이 문제를 해결하려면 어떻게해야합니까? 스위프트

내가 생각
+1

다른 클래스에서이 함수를 어디에서 호출하고 있습니까? – 3stud1ant3

+1

'viewWillAppear'와 같은 뷰 컨트롤러주기 이벤트를 직접 호출하지 마십시오. – Paulw11

+0

@ 3stud1ant3이 질문 할 때, 당신이 버튼을 처리하고있는 곳과 그 함수를 어떻게 호출하고 있는가?가능성은 스토리 보드 장면에 연결되어 있지 않은보기 컨트롤러의 새 인스턴스를 인스턴스화하고 있으므로 테이블보기가 nil입니다. – Paulw11

답변

1

에 상당히 새로운, 문제는 코드의 라인에 있습니다

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellReuseIdentifier") as! eventTableViewCell 
    let event = eventData[indexPath.row] 
    cell.eventLabel.text = event.session 
    return cell 
} 
  • 당신은 셀 식별자가 셀 식별자
  • 그리고 수와 동일 확인하실 수 있습니다 행의 행 eventData 배열
+1

... 그리고'eventLabel' ** 콘센트 **가 올바르게 설정되어 있습니다 (참조 ** **'nil'이 아님) –

+0

나는 이것이 문제라고 생각하지 않습니다. 이 함수는 viewDidLoad()에서 함수를 처음 호출 할 때 잘 작동하며 두 번째로 버튼을 누를 때만 문제가 발생합니다. – gannon96

+0

'if let' 또는'guard' 문을 사용하여 선택적 값을 풀고 중단 점을 넣고 실제 오류가 어디에서 발생하는지 찾으십시오. –

관련 문제