2017-12-14 2 views
0

편집 : 관련 세부 정보를 추가하십시오.예기치 않게 nil이 발견되었지만 값을 인쇄 할 수 있습니다.

내 앱의 경우 날씨 정보가 다른 3 개의 페이지가 있어야합니다. 나는 그것들을보기 위해 수평으로 스크롤 할 수있다. 나는이 유튜브 비디오와 Github 프로젝트를 참고했다. 내가 무슨 짓을

https://github.com/ibrdrahim/slidePage

https://www.youtube.com/watch?v=1_daE3IL_1s 메인 스토리 보드에 스크롤 뷰를 추가 할 수 있습니다. 그런 다음 xib로 3 개의 Cocoa Touch 클래스를 만듭니다. 각각은 UIViewController의 하위 클래스입니다. 각 xib는 스크롤보기에서 페이지로 작동합니다.

이것은 설치 xib보기에 사용 된 코드입니다.

enter image description here

let xOrigin = self.view.frame.width 

let credit : CreditScreenView = CreditScreenView(nibName: "CreditScreenView", bundle: nil) 

mainScroll.addSubview(credit.view) 

let forcast : ForcastScreenView = ForcastScreenView(nibName: "ForcastScreenView", bundle: nil) 

mainScroll.addSubview(forcast.view) 

let now : NowScreenView = NowScreenView(nibName: "NowScreenView", bundle: nil) 

mainScroll.addSubview(now.view) 

// set up the size for each view 
credit.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height) 

forcast.view.frame = CGRect(x: xOrigin, y: 0, width: self.view.frame.width, height: self.view.frame.height) 

now.view.frame = CGRect(x: xOrigin * 2, y: 0, width: self.view.frame.width, height: self.view.frame.height) 

mainScroll.contentSize = CGSize(width: CGFloat(view.frame.width * 3), height: CGFloat(view.frame.height)) 
mainScroll.contentOffset.x = view.frame.width * 3 

는 NowScreenView에 연결된 모든 출구이다.

updateWeatherData는 JSON을 가져온 후에 호출됩니다.

func getWeatherData(url: String, parameters: [String : String]) { 

    Alamofire.request(url, method: .get, parameters: parameters).responseJSON { 
     response in 
     if response.result.isSuccess { 
      print("Success! Got the weather data") 

      let weatherJSON : JSON = JSON(response.result.value!) 

      print(weatherJSON) 

      self.updateWeatherData(json: weatherJSON) 
     } 
     else { 
      print("Error \(String(describing: response.result.error))") 
      self.cityLabel.text = "链\n接\n不\n可\n用" 
     } 
    } 
} 

나는 지금 내 첫 번째 iOS 앱을하고있는 중이 야. 날씨 앱입니다. 이유를 이해할 수없는 치명적인 오류가 발생했습니다. JSON 파일에서 가져온 위치 데이터를 화면의 cityLabel에 할당하고 싶습니다. 도시 이름을 보여줍니다. 지금은 JSON에서 위치 데이터의 값을 인쇄 할 수 있지만 라벨에 할당하려면 치명적인 오류가 발생합니다.

func updateWeatherData(json : JSON) { 
    let data = json["HeWeather6"][0] 
    let status = data["status"].stringValue 
    //print(json) 
    if status == "ok" { 
     let tmpsNow = data["now"]["tmp"].intValue 

     weatherDataModel.temperature = tmpsNow 
     weatherDataModel.city = data["basic"]["location"].stringValue 
     weatherDataModel.condition = data["now"]["cond_code"].intValue    
     weatherDataModel.weatherIconName = weatherDataModel.updateWeatherIcon(condition: weatherDataModel.condition) 

     updateUIWithWeatherData() 
    } else { 
     cityLabel.text = "天\n气\n不\n可\n用" 
    } 
} 

이것은 JSON에서 데이터를 얻은 방법입니다. 다른 weatherDataModel.swift가 JSON 데이터를 정렬합니다.

func updateUIWithWeatherData() { 
    cityLabel.text = "\(weatherDataModel.city)" 
    nowTemp.text = "\(weatherDataModel.temperature)º" 
    weatherIcon.image = UIImage(named: weatherDataModel.weatherIconName)! 
} 

날씨 데이터를 받으면 UI를 업데이트하는 방법입니다.

내가

cityLabel.text = "\(weatherDataModel.city)" 

enter image description here

내가 print(weatherDataModel.city)하려고이 라인에 치명적인 오류가 발생했습니다, 그것은 오류없이 도시 이름을 인쇄합니다. 하지만 cityLabel에 값을 할당 할 수 없었습니다. 누군가가 문제의 원인을 알아내는 데 도움을 줄 수 있습니까? 감사!

누군가가 전체 코드를보고 싶어하는 경우에 대비 한 GitHub 링크입니다. https://github.com/lucky13820/air

+0

해당 줄에있는 하나의 변수에만 집중하지 마십시오. 이 줄에는 다른 변수가 있습니다. 'cityLabel'은 무효입니다. 콘센트를 연결하십시오. – rmaddy

+0

@rmaddy IBOutlet으로 cityLabel을 연결했습니다. 나는 또한 viewDidLoad()에서 값을 제공한다. – lucky13820

+0

디버거를 사용하십시오. 정말로 어떤 값이 '없음'인지 확인하십시오. – rmaddy

답변

2

코드가 컴파일되었으므로 문제가 모델에 포함되지 않았습니다. 문제는 ViewController.swift 클래스입니다. 우선이 방법으로 nib 파일로보기를 만듭니다.

NowScreenView(nibName: "NowScreenView", bundle: nil) 

실수를 당신이하고있는 실수는 이런 식으로 클래스 수준 변수를 만드는 것입니다. 그건 완전히 틀렸어.

let nowWeather = NowScreenView() 

NowScreenView 왜 당신이 전무 라벨을 받고 당신의 NowScreenView의 참조를 얻을 수있는 진정한 방법이 당신이 당신의 NowScreenView의 참조를 얻을 수없는 수행하여 클래스를 단순한 뷰 클래스를 공유하고 이잖아되지

입니다
nowWeather = NowScreenView(nibName: "NowScreenView", bundle: nil) 

지금 nowWeather는 뷰의 참조를 가지고 있으며, 당신은 당신의 뷰 데이터 멤버에 액세스 할 수 있습니다.

+0

여기 @lucky는 수정 된 코드입니다. https://ufile.io/ne0m2 –

+0

정말 고마워요. 완벽하게 작동했습니다! – lucky13820

-2

int 값을 레이블에 넣으려는 것으로 보이기 때문에 .stringValue를 weatherDataModel.temperature = tmpsNow 끝에 추가해보십시오. 이것이 도움이되는지 알려주십시오.