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