gpt4 book ai didi

ios - UIViewController 中的 textLabel.text 在从 NSObject 分配字符串时出现 nil

转载 作者:行者123 更新时间:2023-11-29 12:01:46 25 4
gpt4 key购买 nike

我是 iOS 和编程菜鸟,所以对于任何糟糕的措辞或错误,我深表歉意。

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

这是我的 View Controller ,我在其中发出初始报价请求

    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]


}





}


}

}

这是我的模型,我在其中尝试重新分配 quoteLabel.text 并得到 nil

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

}




}
}
}



}

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

最佳答案

在你的函数中 fetchQuote() ,您将 quoteVC 设置为 RSQuotesViewController() 的新实例,其中 let quoteVC = RSQuotesViewController() .相反,您应该设置 quoteLabel.text对于 RSQuotesViewController() 的应用程序实例.您还提出了两个 API 请求。一旦进入 fetchQuote() RSQuotesViewController 的功能一旦进入你的fetchQuote() RSQuotes 的函数


我认为您正在寻找的内容涉及关闭。为您的 fetchQuote() 试试这个在你的 RSQuotes 中发挥作用类

    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)

}
}

然后,我会有一个 setQuote函数 RSQuotesViewController你可以在哪里做这样的事情

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

我会看一些与快速关闭相关的帖子,并查看。 http://goshdarnclosuresyntax.com/


附带说明一下,我不确定您是否打算在 RSQuote 中操作 quoteString|类(class)。如果不是,fetchQuote() 可能会更好成为static func .这样你就可以调用它而无需初始化 RSQuoteViewController 中的对象。 .它会像RSQuote.fetchQuote()

关于ios - UIViewController 中的 textLabel.text 在从 NSObject 分配字符串时出现 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36669505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com