lable.text - 致命错误

时间:2015-05-19 14:50:50

标签: ios swift fatal-error

我有2节课。 在第一堂课我有一个标签和一个按钮,在第二课我有JsonPars功能

我需要将第二类数据写入第一类标签。

这是我的代码:

    import UIKit
    import CoreLocation

    //main class

    class ViewController: UIViewController{


    @IBOutlet weak var labl: UILabel!

    @IBAction func btn(sender: AnyObject) {
        Json().Pars()
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

和第二课:

import Foundation

//Json-class
class Json {
    func Pars() {
        let url = NSURL(string: "http://my.url.com")
        let task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in
        if (error != nil){
            println(error.localizedDescription)
        }
        var err: NSError?

        let parseObj: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: &err)

        if let json = parseObj as? NSDictionary{
            if let response = json["response"] as? NSDictionary{
               if let obj = response["Object"] as? NSDictionary{
                    if let data = obj["data"] as? NSString {
                       println(data)//work's and i have a data
                       ViewController().labl.text = data //fatal error: unexpectedly found nil while unwrapping an Optional value


                        }
                    }
                }
            }

        })

        task.resume()
    }
}

对不起我的英文

2 个答案:

答案 0 :(得分:1)

问题是,当您致电ViewController时,您正在创建ViewController()的新实例。由于您还没有提供视图控制器,因此它的出口尚未设置且为nil。因此,当您尝试访问labl(隐式解包的可选项)时,它等于nil并且您的应用程序崩溃了。

要解决此问题,可能pars()(它的方法使用小写方法)可以返回数据,然后您可以在ViewController类中访问该数据。

答案 1 :(得分:-2)

抱歉,我在联想上课,所以我无法测试,但请尝试:

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end

@implementation AppDelegate
- (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)opt
{
  // Content
  UILabel * aLbl = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 200, 40)];
  aLbl.text = @"In-call status bar issue";

  UIViewController * aContent = [[UIViewController alloc] init];
  aContent.title = @"Title";
  aContent.view.backgroundColor = UIColor.whiteColor;
  [aContent.view addSubview:aLbl];

  UINavigationController * aNav = [[UINavigationController alloc]
    initWithRootViewController:aContent];

  // Parentmost view controller containing the navigation view controller
  UIViewController * aParent = [[UIViewController alloc] init];
  [aParent.view addSubview:aNav.view];
  [aParent addChildViewController:aNav];
  [aNav didMoveToParentViewController:aParent];

  self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
  self.window.rootViewController = aParent;
  [self.window makeKeyAndVisible];

  return YES;
}
@end

int main(int argc, char ** argv)
  { @autoreleasepool { return UIApplicationMain(argc, argv, nil, @"AppDelegate"); } }

我通常会这样做,以防我在某些时候需要它。此外,如果失败,可以尝试将数据发送到viewcontroller,然后将其应用于label.text。

编辑:你也有:

import Foundation
import UIKit

上面的task.resume,请查看它,看看是否无法修复它。