2017-01-16 23 views
0

概要致命的なエラーが発生しまし

私は現在、いつものObjective-Cでうまく働いた問題に直面していますが、私は、ように見えることはできませんSwift(特にv3)で動作するようになりました。これはすべてストーリーボードを使用して構築されています。

  1. のViewController: WKWebView & UIButtonItems
  2. SideMenuTableView:のUITableView & UIButtons

現在、SideMenuはのViewControllerの上に、モーダル、オーバーポップ私は2つの別々のView Controllerを持っていますUIButtonを介して一連のアクションをリストします。私はちょうどアイデアを落とすために、もっとも単純な例をとっていくつもりです。私がこの例で達成しようとしているのは、UButtonタップ(SideMenuTableView)からWKWebView(ViewController)をリロードすることです。

Screenshots.png

現在、私はシンプルなストーリーボードセグエ(Kind: Present Modally)でSideMenuを呼び出すことができます。以下は、私は物事はまだ不明である場合に取得しようとしています何のより鮮明な画像です。さらに、実装されたSideMenuを単純な0​​関数で却下することもできます。

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() 
    } 
} 

EDIT:更新セグエコードリフレッシュ機能を呼び出そうとしたときにしかし、私は、次のエラーメッセージが表示されます。

// 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

[致命的なエラー:任意の値をアンラッピングしている間に予期せぬエラーが発生しました "とはどういう意味ですか?](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では、その代理人への参照を保持する変数を作成します。

weak var delegate: MainViewControllerDelegate? 

prepareForSegue()関数ViewControllerにあります。

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

今すぐあなたの@IBActionボタンタップでSideMenuTableViewにデリゲートメソッドを呼び出します。先のセグエがあなたのSideMenuTableViewであるかどうかを確認してください。

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

あなたViewControllerが(それはそれのクラスにリフレッシュ機能を持っている必要があります)、このプロトコルに準拠しているので、リフレッシュ機能が実行されます。

+0

ああ!これは私が探していた解決策でした!今、初心者の視点では、プロトコルの実装について、またViewControllerに準拠させるためにどこに行きますか?私はそれをViewController内に拡張型スニペットとして配置するのか、またはAppDelegateに配置しますか? –

+0

私は通常私のクラスの下の同じファイルに私のプロトコルを置きます。他のデリゲートと同じように、クラス名の背後にprotol名を書いて、それに従います。次に、プロトコルに記述されているクラスと同じ名前とパラメータを持つ関数をクラスに作成します。 – Emptyless

+0

ありがとうございました!私はいつも拡張機能、プロトコルなどの適切な配置について疑問を抱いてきました。 –

関連する問題