2017-01-16 2 views
0

요약치명적인 오류

나는 현재 항상 목표 - C에서 잘 작동 문제에 직면하고있다,하지만 난 얻을 수없는 것 Swift (특히 v3)에서 작동합니다. 이것은 모두 스토리 보드를 사용하여 제작되었습니다.

  1. 의 ViewController : 나는 두 개의 뷰 컨트롤러가 & UIButtonItems
  2. SideMenuTableView WKWebView : jQuery과 & UIButtons 현재

는 SideMenu은의 ViewController의 상단에, 모달, 이상 아빠 UIButton을 통해 일련의 작업 목록을 표시합니다. 나는 생각을 떨어 뜨리기 위해 가장 단순한 예에서 벗어날 것입니다. 이 예제에서 수행하고자하는 것은 UButton 탭 (SideMenuTableView)에서 WKWebView (ViewController)를 다시로드하는 것입니다.

Screenshots.png

현재, 나는 간단한 스토리 보드 SEGUE (Kind: Present Modally)으로 SideMenu를 호출 할 수 있습니다 : 아래는 내가 일이 여전히 불분명 한 경우에 얻을 것을 시도하고 무엇을 더 명확한 그림이다. 또한, 간단한 close() 함수로 구현 된 SideMenu를 닫을 수 있습니다.

fatal error: unexpectedly found nil while unwrapping an Optional value 

코드

import UIKit 
import WebKit 

class ViewController: UIViewController, UINavigationControllerDelegate, WKNavigationDelegate { 

    var webView: WKWebView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let webURL = URL(string: "https://google.ca") 
     let webRequest = URLRequest(url: webURL!) 
     webView.load(webRequest) 

    func refresh() { 
     webView.reload() 
    } 
} 



import Foundation  

class SideMenuTableView: UITableViewController { 

    @IBAction fileprivate func close() { 
     self.dismiss(animated: true, completion: nil) 
    } 

    @IBAction func refresh(sender: AnyObject!) { 
     ViewController().refresh() 
     close() 
    } 
} 

편집 : 업데이트 SEGUE 코드 새로 고침 함수를 호출 할 때 그러나, 나는 다음과 같은 오류 메시지가 나타납니다.

// MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
     if let vc = segue.destination as? SideMenuTableView { 
      vc.delegate = self 
     } 
    } 
} 
+1

[치명적인 오류 : 선택 값을 언 래핑하는 동안 예기치 않게 nil이 발견되었습니다 "는 의미는 무엇입니까?] (http://stackoverflow.com/questions/32170456/what-does-fatal-error-unexpectedly-found- nil-while-unwrapping-an-optional-valu) – JAL

+2

BTW'ViewController(). refresh()'는 의미가 없습니다. ** 새로운 ** 뷰 컨트롤러를 초기화하고 그것에'refresh'를 호출하고 있습니까? – JAL

+0

@ JAL에 감사드립니다! 나는 그 코드로 정확히 무엇을하고 있는지 궁금해하고 있었다. –

답변

3

당신은 ViewController().refresh()로 새로운 UIViewController를 초기화된다.

는 프로토콜을 만들기 :

protocol MainViewControllerDelegate /* Can be called whatever you like */ { 
    func refresh() 
} 

을 그리고 ViewController 그것에 당신을 준수 할 대리자 패턴은 당신이 시도하고있는 무슨 달성 할 수있는 더 좋은 방법입니다.

SideMenuTableView에서 대리자에 대한 참조를 보유 할 변수를 만듭니다. ViewController 당신의 prepareForSegue() 함수에서

weak var delegate: MainViewControllerDelegate? 

. 대상 SEGUE이 SideMenuTableView 있는지 확인합니다 :

if let vc = destination.vc as? SideMenuTableView { 
    vc.delegate = self 
} 

지금 SideMenuTableView에 @IBAction 버튼 탭에서 대리자 메서드를 호출합니다.

@IBAction func refresh(sender: AnyObject!) { 
     delegate?.refresh() 
     close() 
} 

당신의 ViewController이 프로토콜을 준수하기 때문에 (그것의 클래스에서 새로 고침 기능을 가지고있다)을, 새로 고침 기능이 실행됩니다.

+0

아! 이것은 내가 찾고 있었던 해결책이었다! 이제 초보자 관점에서 프로토콜을 구현하고 ViewController를 준수해야 할 곳은 어디입니까? ViewController 내부에 확장 유형 스 니펫으로 배치하거나 AppDelegate에 배치합니까? –

+0

나는 대개 내 클래스 아래에 같은 파일에 내 프로토콜을 배치합니다. 당신은 다른 대표들처럼 당신의 protol 이름을 클래스 이름 뒤에 써서 그것을 준수합니다. 그런 다음 프로토콜에 설명 된 것과 동일한 이름과 매개 변수를 사용하지만 현재 클래스에있는 함수를 만듭니다. – Emptyless

+0

대단히 감사합니다! 나는 항상 확장, 프로토콜 등의 적절한 배치에 대해 궁금해했다. –