Ios UIViewController中的textLabel.text在从NSObject分配字符串时显示为零

Ios UIViewController中的textLabel.text在从NSObject分配字符串时显示为零,ios,uiviewcontroller,swift2,alamofire,nsobject,Ios,Uiviewcontroller,Swift2,Alamofire,Nsobject,我是一个iOS和编程高手,所以我为任何不好的措辞或错误道歉 我正在解析我的应用程序的API中的引用,每次单击UIButton时,它都会显示在文本标签上。为了防止字符串脱离文本标签或被调整为不可读的字体,我试图通过调用NSObject中的函数来请求一个新的引号,如果字符串计数太高。我设置了一个NSObject来执行重新蚀刻,但每当我尝试从NSObject将字符串重新分配给textLabel.text或尝试将字符串发送回ViewController时,qouteLabel.text返回为零 这是我的

我是一个iOS和编程高手,所以我为任何不好的措辞或错误道歉

我正在解析我的应用程序的API中的引用,每次单击UIButton时,它都会显示在文本标签上。为了防止字符串脱离文本标签或被调整为不可读的字体,我试图通过调用NSObject中的函数来请求一个新的引号,如果字符串计数太高。我设置了一个NSObject来执行重新蚀刻,但每当我尝试从NSObject将字符串重新分配给textLabel.text或尝试将字符串发送回ViewController时,qouteLabel.text返回为零

这是我的viewcontroller,我在这里提出报价的初始请求

    import UIKit
import Alamofire

class RSQuotesViewController: RSViewController {


    var ronImageView: UIImageView!
    var quoteLabel = UILabel!()


    override func loadView() {
        let frame = UIScreen.mainScreen().bounds
        let view = UIView(frame: frame)
        view.backgroundColor = UIColor.grayColor()



        ronImageView = UIImageView(frame: CGRectMake(frame.width/2-160, frame.height-600, 320, 600))
        let ron = "ron.png"
        let ronImage = UIImage(named: ron)
        ronImageView.image = ronImage
        view.addSubview(ronImageView);

        let labelWidth = ronImageView.frame.width/2
        let quoteLabelX = labelWidth-40

        quoteLabel = UILabel(frame: CGRect(x: quoteLabelX, y: ronImageView.frame.height/4+15, width: labelWidth, height: 160))
        quoteLabel.textAlignment = .Center
        quoteLabel.text = "Click to Start"
        quoteLabel.shadowColor = UIColor.grayColor()
        quoteLabel.adjustsFontSizeToFitWidth = true
        quoteLabel.lineBreakMode = .ByWordWrapping // or NSLineBreakMode.ByWordWrapping
        quoteLabel.numberOfLines = 0
        view.addSubview(quoteLabel)


        self.view = view
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let frame = UIScreen.mainScreen().bounds

        let getQuote = UIButton(frame: CGRect(x: 0, y: 0, width: frame.size.width+50, height: frame.size.height))
        getQuote.backgroundColor = UIColor.clearColor()
        getQuote.setTitle("", forState: UIControlState.Normal)
        getQuote.addTarget(self, action: #selector(RSQuotesViewController.getQuote(_:)), forControlEvents: UIControlEvents.TouchUpInside)

        self.view.addSubview(getQuote)

    }



    //  Gets quote when button is pressed
    func getQuote(sender: UIButton){
        let url = "http://ron-swanson-quotes.herokuapp.com/v2/quotes"
        Alamofire.request(.GET, url, parameters: nil).responseJSON { response in
            if let JSON = response.result.value as? Array<String>{
                let quoteDict = RSQoute()

                // if quote is too large get another one
                if (JSON[0].characters.count > 120){

                    print("greater than 120")
                    quoteDict.fetchQuote()

                } else {

                    self.quoteLabel.text = JSON[0]


                }





        }


    }

}
导入UIKit
进口阿拉莫菲尔
类RSQuotesViewController:RSViewController{
var ronImageView:UIImageView!
var quoteLabel=UILabel!()
重写func loadView(){
设frame=UIScreen.mainScreen().bounds
let view=ui视图(帧:帧)
view.backgroundColor=UIColor.grayColor()
ronImageView=UIImageView(帧:CGRectMake(frame.width/2-160,frame.height-600320600))
让ron=“ron.png”
让ronImage=UIImage(名称:ron)
ronImageView.image=ronImage
视图。添加子视图(ronImageView);
设labelWidth=ronImageView.frame.width/2
设quoteLabelX=labelWidth-40
quoteLabel=UILabel(帧:CGRect(x:quoteLabel,y:ronImageView.frame.height/4+15,宽度:labelWidth,高度:160))
quoteLabel.textAlignment=.Center
quoteLabel.text=“单击以开始”
quoteLabel.shadowColor=UIColor.grayColor()
quoteLabel.adjustsFontSizeToFitWidth=true
quoteLabel.lineBreakMode=.ByWordWrapping//或NSLineBreakMode.ByWordWrapping
quoteLabel.numberOfLines=0
view.addSubview(quoteLabel)
self.view=view
}
重写func viewDidLoad(){
super.viewDidLoad()
设frame=UIScreen.mainScreen().bounds
让getQuote=UIButton(frame:CGRect(x:0,y:0,宽度:frame.size.width+50,高度:frame.size.height))
getQuote.backgroundColor=UIColor.clearColor()
getQuote.setTitle(“,用于状态:UIControlState.Normal)
getQuote.addTarget(self,action:#选择器(RSQuotesViewController.getQuote(#:)),forControlEvents:UIControlEvents.TouchUpInside)
self.view.addSubview(getQuote)
}
//按下按钮时获取报价
func getQuote(发件人:UIButton){
让url=”http://ron-swanson-quotes.herokuapp.com/v2/quotes"
请求(.GET,url,参数:nil).responseJSON{response in
如果让JSON=response.result.value作为?数组{
让quoteDict=RSQoute()
//如果报价太大,请另取一个
如果(JSON[0].characters.count>120){
打印(“大于120”)
quoteDict.fetchQuote()
}否则{
self.quoteLabel.text=JSON[0]
}
}
}
}
这是我的模型,我试图重新分配quoteLabel.text,但得到零

import UIKit
import Alamofire

class RSQoute: NSObject {

    var newQuote = String()


    //   fetchs new quote if quote is too large

    func fetchQuote(){

        let url = "http://ron-swanson-quotes.herokuapp.com/v2/quotes"
        Alamofire.request(.GET, url, parameters: nil).responseJSON { response in
            if let JSON = response.result.value as? Array<String>{
            self.newQuote = JSON[0]
                if (self.newQuote.characters.count > 120) {

                    print("Try Again: ---->\(self.newQuote)")
                    return self.fetchQuote()
                } else {
                    let quoteVC = RSQuotesViewController()
                    print("Retry was less than 120: ---->\(self.newQuote)")
                    print("quoteLabelText: ---->\(RSQuotesViewController().quoteLabel.text)")// comes back nil
                    RSQuotesViewController().quoteLabel.text = self.newQuote

                }




        }
    }
    }



}
导入UIKit
进口阿拉莫菲尔
类RSQoute:NSObject{
var newQuote=String()
//如果报价太大,则获取新报价
func fetchQuote(){
让url=”http://ron-swanson-quotes.herokuapp.com/v2/quotes"
请求(.GET,url,参数:nil).responseJSON{response in
如果让JSON=response.result.value作为?数组{
self.newQuote=JSON[0]
如果(self.newQuote.characters.count>120){
打印(“重试:-->\(self.newQuote)”)
返回self.fetchQuote()
}否则{
设quoteVC=RSQuotesViewController()
打印(“重试时间小于120:--->\(self.newQuote)”)
打印(“quoteLabelText:--->\(RSQuotesViewController().quoteLabel.text)”//返回零
RSQuotesViewController().quoteLabel.text=self.newQuote
}
}
}
}
}

请告诉我,如果我遗漏了什么,或者有一种更简单/更好的方法尝试从API获取新报价:)

在函数
fetchQuote()
中,您使用
let quoteVC=RSQuotesViewController()将quoteVC设置为RSQuotesViewController()的新实例化
。相反,您应该为
RSQuotesViewController()
的应用程序实例设置
quoteLabel.text
。您还发出两个API请求。一次在
RSQuotesViewController
函数中,一次在
fetchQuote()中
RSQuotes的函数


我认为您需要的是闭包。请在您的
RSQuotes
类中的
fetchQuote()
函数中尝试此方法

    func fetchQuote(completion: (result:String)){

    let url = "http://ron-swanson-quotes.herokuapp.com/v2/quotes"
    Alamofire.request(.GET, url, parameters: nil).responseJSON { response in
        if let JSON = response.result.value as? Array<String>{
        self.newQuote = JSON[0]
            if (self.newQuote.characters.count > 120) {

                print("Try Again: ---->\(self.newQuote)")
                completion(result: self.newQuote)
            } else {
                print("Retry was less than 120: ---->\(self.newQuote)")
                print("quoteLabelText: ---->\(RSQuotesViewController().quoteLabel.text)")// comes back nil
                completion(result: self.newQuote)

            }
    }
我会看看一些与swift关闭相关的帖子,也会看看


另一方面,我不确定您是否计划在
RSQuote
类中操纵quoteString。如果不是,则
fetchQuote()可能更好
成为一个
静态函数
。这样你就可以调用它,而不用在
RSQuoteViewController
中初始化对象。它类似于
RSQuote.fetchQuote()

func setQuote() {
    let quoteObj = RSQuote()
    quoteObj.fetchQuote() {
         result in
         quoteLabel.text = result
    }
}