2017-03-26 2 views
0

셀이 segue 함수 준비에 연결되어 있으며이 방법이 작동하는 UITableView VC가 있습니다. 올바른 VC로 이동합니다. performForSegue를 호출하는 메서드에 연결된 탐색 항목에 rightBarButtonItem을 추가하고 올바른 식별자를 지정했습니다. 오른쪽 버튼을 클릭하기 전까지는 모두 잘 돌아갑니다. 내가 얻을 때 : "첫 번째 호출 스택을 던져. 유형 NSException의 잡히지 않은 예외로 종료"누군가 날 도와주고 제발 올바른 방향으로 나를 가리켜 주시겠습니까? 코드 및 인쇄 목록은 다음과 같습니다. 고맙습니다.segue를 수행하려고 시도하면 "NSException 유형의 catch되지 않는 예외로 종료"로 연결됩니다.

2017-03-26 21:50:28.041 PDCiPad[10433:292572] -[PDCiPad.AssignNumberOfRoomsForFloorsVC navigateToNextViewController]: unrecognized selector sent to instance 0x7ff5b7c326c0 

2017년 3월 26일 21 : 50 : 28.219 PDCiPad [10,433 : 292572] * 종료 애플리케이션에 의한 캐치되지

class AssignNumberOfRoomsForFloorsVC: UITableViewController { 

//MARK: - Properties 

private var managedObjectContext: NSManagedObjectContext! 

private var storedFloors = [Floors]() 


//MARK: - Actions 

override func viewDidLoad() { 
    super.viewDidLoad() 
    managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
    loadFloorData() 
    self.tableView.reloadData() 
    self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: self, action: Selector(("navigateToNextViewController"))) 

} 

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

private func loadFloorData() { 
    let request: NSFetchRequest<Floors> = Floors.fetchRequest() 
    request.returnsObjectsAsFaults = false 
    do { 
     storedFloors = try managedObjectContext.fetch(request) 
    } 
    catch { 
     print("could not load data from core \(error.localizedDescription)") 
    } 
} 

private func navigateToNextViewController(){ 
    self.performSegue(withIdentifier: "room and alarm type", sender: self) 
} 



// MARK: - Table view data source 

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

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

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "floor cell", for: indexPath) as! FloorCell 
    let floorItem = storedFloors[indexPath.row] 
    cell.floorNumberTxt.text = String(floorItem.floorNumber) 
    return cell 
} 

// MARK: - Navigation 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    var selectedRow = self.tableView.indexPathForSelectedRow 
    let floorItem = storedFloors[(selectedRow?.row)!] 
    let destinationController = segue.destination 
    if let assignRoomsVC = destinationController as? DeclareRoomsVC { 
     if let identifier = segue.identifier { 
      switch identifier { 
      case "assign number of rooms": 
       let _ = assignRoomsVC.view 
       assignRoomsVC.floorNumberTxt.text = String(floorItem.floorNumber) 
       assignRoomsVC.selectedFloor = floorItem.floorNumber 
      default: break 
      } 
     } 
    } 
} 

}

이 콘솔의 메시지 인 예외 'NSInvalidArgumentException', 이유 : '- [PDCiPad.AssignNumberOfRoomsForFloorsVC navigateToNextViewController] : 인스턴스로 전송 된 인식 할 수없는 선택기 0x7ff5b7c326c0' * 첫 번째 호출 스택 스택 : 23,516,0 CoreFoundation에서의 0x000000010db79d4b exceptionPreprocess + 171 1 libobjc.A.dylib 0x000000010d1ba21e objc_exception_throw + 48 0x000000010dbe9f04 CoreFoundation에서 2 - [NSObject의 (NSObject의) doesNotRecognizeSelector :] + 132 3 CoreFoundation에서 0x000000010daff005 ___forwarding_ + 1,013 4 CoreFoundation에서 0x000000010dafeb88 _CF_forwarding_prep_0 + 120 5 UIKit 0x000000010e6b28bc - [UIApplication sendAction : from : forEvent :] + 83 6 UIKit 0x000000010eaf44a1 - [UIBarButtonItem (UIInternal) _sendAction : withEvent :] + 149 7 UIKit 0x000000010e6b28bc - [UIApplication sendAction : 대상 : fromEvent :] + 83 8 UIKit 0x00 0000010e838c38 - [UIControl 액션 (SendAction) : 다음과 forEvent :] + 67 9 UIKit 0x000000010e838f51 - [UIControl _sendActionsForEvents : withEvent :] + 444 10 UIKit의 0x000000010e8390db - [UIControl _sendActionsForEvents : withEvent :] + 838 11 UIKit의 0x000000010e837e4d - [UIControl touchesEnded : withEvent :] + 668 12 UIKit 0x000000010e720545 - [UIWindow _sendTouchesForEvent :] + 2,747 13 UIKit 0x000000010e721c33 - [UIWindow sendEvent :] + 4011 14 UIKit의 0x000000010e6ce9ab - [UIApplication sendEvent :] + 371 15 UIKit 0x000000010eebb72d dispatchPreprocessedEventFromEventQueue + 3248 16 UIKit 0x000000010eeb4463 __handleEventQueue + 4879 17 CoreFo undation 0x000000010db1e761 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 17 18 CoreFoundation에서의 0x000000010db0398c __CFRunLoopDoSources0 + 556 19 CoreFoundation에서 0x000000010db02e76 __CFRunLoopRun + 918 20 CoreFoundation에서 0x000000010db02884 CFRunLoopRunSpecific + 420 21 GraphicsServices 0x0000000113908a6f GSEventRunModal + 161 22 UIKit 0x000000010e6b0c68 UIApplicationMain + 159 23 PDCiPad 0x000000010cad8c1f 메인 + 111 24 libdyld.dylib 0x0000000111a3268d start + 1 ) libC++ abi.dylib : 형 NSException의 캐치되지 않는 예외

new problem

답변

2

당신은 클릭하면 당신의 UIBarButtonItem 당신이 indexPathForSelectedRow을 사용하고 선택하지 않았기 때문에, selectedRownil입니다 모든 행.

override func prepare(for segue: UIStoryboardSegue, sender: Any?)UIBarButtonItem 또는 tableView 셀을 클릭하면 호출됩니다.

따라서 self.tableView.indexPathForSelectedRow이 선택한 셀의 색인을 반환하므로 tableView 셀을 클릭하면 작동합니다. 그러나 UIBarButtonItem에 대해 nil을 반환합니다.

마지막으로 nil 값에 !을 사용하면 충돌이 발생합니다.

0

사용 스위프트 3 selector 구문을 종료

#selector(navigateToNextViewController) 
+0

이 질문은 속임수를 쓰는 좋은 표준이 필요합니다. – rmaddy

+0

시간을내어 주셔서 감사합니다. 나는 네가 한 말을 끝내고 오류를 내 prepareForSegue로 옮겼다. 당신은 내 모습을보고 올바른 방향으로 나를 가리킬 수 있습니까? –

+0

다른 예외입니다. 무슨 예외? 'indexPathForSelectedRow'는'nil' 가능성이 큽니다. 부주의하게 작성된 느낌표는 충돌 초대입니다. – vadian

관련 문제