2016-05-26 8 views
0

現在、2つのビューコントローラと、電話番号などの店舗の詳細を扱う迅速なファイルを扱っています。メインのViewControllerとDetailsViewControllerがあります。プロパティ値が表示されますが、ラベルに割り当てられている場合は表示されません。

私は現在、GoogleプレイスAPIからデータを取得しており、値をPlaceDetailsクラスに正常に保存することができます。データのテスト - コンソールに印刷できます。しかし、APIから取得した値をUILabelに割り当てると、アプリケーションがクラッシュし、プロパティの値がnilであることが示されます。なぜこれが当てはまるのか分かりません。私は2つのView Controllerで、PlaceDetailsクラスを正しくインスタンス化していて、そのプロパティに正しくアクセスしていると感じますが、間違っていることに気づいていないものがあります。

class ViewController: UIViewController 
{ 
    let placeDetails = PlaceDetails() 
    let detailsVC = DetailsViewController() 

    func tapLabel(sender: UITapGestureRecognizer) 
    { 

    // print statement successfully prints out the stored value as - Optional("1 888-555-5555") 
    print(placeDetails.phoneNumber) 

    // assigning value to label causes a crash stating value is nil 
    detailsVC.phoneNumberLabel.text = placeDetails.phoneNumber! 

    self.performSegueWithIdentifier("showDetailsVC", sender: self) 

    } 
} 

class DetailsViewController: UIViewController 
{ 
    @IBOutlet weak var phoneNumberLabel : UILabel! 

    let placeDetails = PlaceDetails() 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     //This approach does not cause a crash but outputs nil to the console for both the print statement and the assignment statement 
     print(placeDetails.phoneNumber) 
     phoneNumberLabel.text = placeDetails.phoneNumber! 
    } 
} 

class PlaceDetails 
{ 
    override init() 
    { 
     super.init() 
    } 
    var phoneNumber : String? //viewcontroller actions give this class property its value 
} 
+1

はphoneNumberLabelがxibに接続されていますか? –

+0

@john elemans phoneNumberLabelはすべて、ストーリーボード上のDetailsViewController上のUILabelとして接続されています:) – lifewithelliott

+0

はい、クラス変数にリンクされていますか? IBでUILabelを右クリックすると、Referencing Outletsの下にリンクされているかどうかが表示されますか? –

答えて

0

であなたのUILabelにテキストを設定します。変数ではなくplaceDetailsletという定数として作成しているので、これは実行していないことが分かります。最初に割り当てた空のPlaceDetailsから変更することはできません。

オプションの変数として宣言し、使用するときには適切にアンラップする必要があります。

class ViewController: UIViewController 
{ 
    let placeDetails = PlaceDetails() 

    func tapLabel(sender: UITapGestureRecognizer) 
    { 
     self.performSegueWithIdentifier("showDetailsVC", sender: self) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
     if (segue.identifier == "showDetailsVC") { 
      let destVC = segue.destinationViewController as! DetailsViewController 
      destVC.placeDetails = self.placeDetails 
     } 
    } 
} 

class DetailsViewController: UIViewController 
{ 
    @IBOutlet weak var phoneNumberLabel : UILabel! 

    var placeDetails: PlaceDetails? 

    override func viewWillAppear(animated: Bool) 
    { 
     super.viewWillAppear(animated) 
     if let placeDetails = self.placeDetails { 
      if let phoneNumber = placeDetails.phoneNumber { 
       self.phoneNumberLabel.text = phoneNumber 
      } 
     } 
    } 
} 

あなたはプロパティが設定されている前に実行されます。この方法としてviewDidLoadの値を使用することはできません。 prepareForSegueが呼び出される前にビューコントローラがロードされているので、viewWillAppearはより良い場所です。

+0

誰が回答に投票したのか分かりませんが、あなたは完璧に働いており、レッスンに感謝しています!確かに主要な教訓は、今後進むことを学んだ:D – lifewithelliott

+0

ええ、どちらか分かりません。ありがとう。あなたは間違いなく使用に注意する必要があります! - コンパイラを幸せに保つためにそれらを追加するだけではありません。オプションがいつnilでテストできるかを理解する必要があります – Paulw11

-1

phoneNumberを文字列でキャストしてください。

detailsVC.phoneNumberLabel.text = String(placeDetails.phoneNumber!) 

また、nil値は、APIの応答のエンコード方法から取得できます。

EDIT

は、私はあなたのshowDetailsVCviewDidLoad()方法であなたのUILabelのテキストを設定することがあると思います。 string変数をshowDetailVCに宣言し、次に宣言した文字列にplaceDetails.phoneNumber変数を渡します。 (tapLabel()メソッドのテキストを直接設定するのではなく)。次に、あなたの showDetailVCにあなたはprepareForSegueであなたの先ビュー・コントローラにplaceDetailsを割り当てる必要がviewDidLoad()

+0

はこの方法を試行したにもかかわらず、問題はまだ発生しています。 EXCの誤った指示とコンソールに "致命的なエラーが表示されました:オプション値をアンラッピングしている間に予期せぬエラーが見つかりました"と表示 (lldb) – lifewithelliott

+0

編集内容を参照してください – AnthonyR

+0

関数を作成しようとしたところ - func setLabel(){let phoneNumber = placeDetails.phoneNumber phoneNumberLabel.text = phoneNumber}をDetailsViewController内に作成し、そのクラスのviewDidLoadでsetLabel()を呼び出そうとしました。ただし、phoneNumberプロパティは "nil"値を出力します。これは私が立ち往生している場所です。 1つのケースで電話番号を正しく出力できる理由はわかりませんが、ViewControllerクラスのもう1つのケースでのみplaceDetailsプロパティにアクセスできます。 – lifewithelliott

関連する問題