2017-08-23 11 views
-1

私は書籍をチェックアウトするための情報を含むStructを持っています。ユーザーが書籍を削除または追加するときには、配列内の書籍の総数を数え、次に別のクラスのラベルに合計を設定するためにdid setメソッドを使用します。問題は、ラベルに番号を設定しようとしたときに、「オプションの値をアンラップしている間に残っている」というメッセージが表示され、この問題を修正しようとしましたが、修正できません。気にいら間違っているのか、多分、私のストーリーボードは、構造体や配列を保持するのViewController間違っスウィフト:アンラップ中のUILabelなし

を設定し、配列の変化

let NewLabel = ViewControllerExtension() 
var ServiceReportArray = [ServiceReport](){ 
    didSet{ 
      let sum : [Int] = ServiceReportArray.map{return$0.NumberOfBooks} 
      let totalSum = sum.reduce(0){return $0 + $1} 
      NewLabel.BooksLabel.text = String(totalSum) 

      //NewLabel.Myreload() 
      // This function returns the same error 
    } 
} 

を監視するためにdidSetを使用してこれは私のラベルはであるクラスですdidSetからの情報を入れるだけでなく、エラーを受け取る代わりに呼び出されるMyreload()関数を作成しました。

class ViewControllerExtension : UIViewController{ 
@IBOutlet weak var BooksLabel: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 
func Myreload(){ 
    let sum : [Int] = ServiceReportArray.map{return $0.NumberOfBooks} 
    let totalSum = sum.reduce(0){return $0 + $1} 
    BooksLabel.text = String(totalSum) 

    } 
} 
+0

UILabelで試してみませんか? –

+0

@NaumanMalikはすでに動作していませんでした。なぜなら、コンテナビューを使用している別のビューコントローラ内にビューコントローラがあるからです。 – user3220141

答えて

0

私は間違っていたと思った。最初に、私のView Controllerは、コンテナビューを使用して別のView Controllerに入っていました(これが問題でした)。この(下図のように)私は先に行って、コンテナビューに識別子を与えた ViewController ID

次の問題を解決するには、私は私のViewControllerに行って、これを追加し、CreateMyLabel機能にアクセスし、それが完全に働きました。

var embeddedViewController : MyCustomeTotalCell! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.embeddedViewController.CreateMyLabel() 
} 



override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let vc = segue.destination as? MyCustomeTotalCell, 
     segue.identifier == "TotalReport"{ self.embeddedViewController = vc 
      } 
} 

問題はビューコントローラーに埋め込まれていたので、segueを使用する必要がありました。これが同じ問題を抱えている人に役立つことを願っています。みんなあなたの助けをありがとう。

0

私は、問題はあなただけUIViewControllerオブジェクトを作成してNewLabel変数を作成していることであると信じています。 @IBOutletはストーリーボード要素にリンクされており、ストーリーボードから作成していないため、BooksLabelnilです。私は

は(だけでなく拡張子の)UIViewControllerのサブクラスを作成し提案する何

。 (拡張子はあなたのために働いている場合は、あなたがこれを必要としないが、それは私が何をすべきかだ)

はその後、次のようにあなたのビューコントローラを初期化します。

let storyboard = UIStoryboard(name: "storyboard_name", bundle: nil) 
let viewController = storyboard.instantiateViewController(withIdentifier: "sb_identifier") as! YourViewControllerClass 

まずあなたがIDを設定する必要がありますストーリーボードのビューコントローラ

sbid

希望は、この助けました!

+0

ちょうど試しましたが、今では "NSException型のキャッチされていない例外で終了しています" – user3220141

0

私の提案は、それはdidSet、ストーリーボードの設定でViewControllerExtensionの検出したプログラム

の実施の順番を実行するために初期化されたかどうか、

まず確認コードの順であります関連するクラスは、あなたが行うことができますあなたのアプリケーションのルートビューコントローラに設定している場合、冗長接続

0

があるかどうか、正しいです:

let viewController = UIApplication.shared.windows[0].rootViewController as? ViewControllerExtension 
viewController.BooksLabel.text = String(totalSum) 

しかし、あなたが最初の子ビューコントローラ(childViewControllers[0])、2番目の子ビュー・コントローラ(childViewControllers[1])に適用している場合は、以下を使用することができます:

let viewController = UIApplication.shared.windows[0].rootViewController?.childViewControllers[0] as? ViewControllerExtension 
viewController.BooksLabel.text = String(totalSum) 

は*これは別の解決策ではなく、最高です。

+0

試してみます。私のビューコントローラは別のビューコントローラの内側にあり、コンテナビューを使用しているため、ビューコントローラが組み込まれているため、なぜ動作していないのか分かりません – user3220141

関連する問題