gpt4 book ai didi

ios - 单击按钮后 UILabel 不更新

转载 作者:搜寻专家 更新时间:2023-11-01 05:56:10 24 4
gpt4 key购买 nike

后台 Xcode 版本 8.2 (8C38)
iOS 10.2 for iPhone 7 plus - 模拟器

我在 objective-c 中实现了这个功能,现在我正试图让它快速工作。代码编译并运行,但是当按钮被点击时标签并没有改变。如果标签正在更新,我会将其发布到 CR 而不是此处。

一开始是面试带回家的问题,但 objective-c 部分让我获得了现场面试。我正在追求这个以了解更多关于swift的信息。面试题

/*
* Create a static library or iOS Framework using Objective-C that performs the following 3 functions:
* - Collects the GPS location (latitude and longitude) of the user at a point in time
* - Collects the battery state and returns whether or not the device is plugged in and what percentage of life is left.
* - Accesses any publicly available, free API to collect the data of your choice and returns it
* (this should be a network call)
*
* Build a simple application with 3 buttons and a label where text can be displayed. Each button should call into the
* three functions of the library described above and output the response to the label. Your application should consist
* of two tabs, one written in Objective-C and one written in Swift. Both tabs should call into the same Objective-C
* library and perform the same function.
*
* Only use Apple frameworks to complete this task. Fully comment your code explaining your logic and choices where multiple
* choices are available. For example, Apple provides numerous ways to retrieve a network resource, document why you choose
* the solution you did.
*/

这可能是一个重复的问题,但我不确定我是否看过以下问题:

我不确定问题出在我进行的异步调用中、我创建按钮本身时,还是顶部的属性/var 声明中。

import UIKit

class ViewController: UIViewController {
var getGPSLongitudeAndLatitudeWithTimeStamp : UIButton?
var getBatteryLevelAndState : UIButton?
var getNextorkImplementation : UIButton?
var displayButtonAction : UILabel?

// The following variables are used in multiple functions. They are constant during the display of the super view
// and control the size of the subviews
var selfWidth : CGFloat = 0.0
var buttonHeight : CGFloat = 0.0
var viewElementWidth : CGFloat = 0.0
var buttonYCenterOffset : CGFloat = 0.0 // The y center should be half the value of the height
var buttonXCenter : CGFloat = 0.0 // Center the button title relative to the width of the button and the width of the super view
var buttonXInit : CGFloat = 0.0
var buttonVerticalSeparation : CGFloat = 0.0
var startingVerticalLocation : CGFloat = 0.0
var displayLabelHeight: CGFloat = 50.0

func initFramingValuesOfMyDisplay() {
selfWidth = self.view.bounds.size.width
buttonHeight = 20.0 // This should be programmable in relative to self.view.bounds.size.height
viewElementWidth = 0.8 * selfWidth;
buttonYCenterOffset = buttonHeight / 2.0; // The y center should be half the value of the height
buttonXCenter = selfWidth / 2.0; // Center the button title relative to the width of the button and the width of the super view
buttonXInit = 0.0;
buttonVerticalSeparation = buttonHeight + buttonYCenterOffset;
startingVerticalLocation = 430.0; // 430 was chosen based on experimentation in the simulator
}

func setLabelWithGPSLatitudeAndLongitudeWithTimeStampData()
{
var actionString : String = "Testing Label Text"

actionString = "GPS Button Action Failure: Data Model not created";

DispatchQueue.global().async {
self.displayButtonAction?.text = actionString
}
}

func setLabelWithBatteryLevelAndState() {
var actionString : String = "Get Battery Level and State";

actionString = "Battery Button Action Failure: Data Model not created"

DispatchQueue.global().async {
self.displayButtonAction?.text = actionString
}
}

func setLabelActionNetwork() {
var actionString :String = "Fake Button set to American Express Stock Price";

actionString = "Network Button Action Failure: Data Model not created";

DispatchQueue.global().async {
self.displayButtonAction?.text = actionString
}
}

func makeAButton(yButtonStart : CGFloat, buttonTitle: String, underSubview: UIButton?) -> UIButton
{
let thisButton = UIButton.init(type: .system)
thisButton.frame = CGRect(x: buttonXInit, y: yButtonStart, width: viewElementWidth, height: buttonHeight)
thisButton.setTitle(buttonTitle, for:UIControlState.normal)

thisButton.backgroundColor = UIColor.yellow
thisButton.setTitleColor(UIColor.black, for: UIControlState.normal)
if ((underSubview) == nil) {
self.view.addSubview(thisButton)
}
else {
self.view.insertSubview(thisButton, belowSubview:underSubview!)
}

return thisButton;
}

func makeALabel(yLabelStart : CGFloat, underSubview: UIButton?) -> UILabel
{
let thisLabel = UILabel.init()
thisLabel.frame = CGRect(x: selfWidth * 0.1, y: yLabelStart, width: viewElementWidth, height: displayLabelHeight)

thisLabel.font = thisLabel.font.withSize(12)
thisLabel.lineBreakMode = .byWordWrapping;
thisLabel.numberOfLines = 0;
thisLabel.textAlignment = NSTextAlignment.center;
thisLabel.textColor = UIColor.black;

if ((underSubview) == nil) {
self.view.addSubview(thisLabel)
}
else {
self.view.insertSubview(thisLabel, belowSubview:underSubview!)
}

return thisLabel;
}

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = UIColor.white
initFramingValuesOfMyDisplay()
addButtonAndLabels()
}

func addButtonAndLabels() -> Void {
if (selfWidth < 1.0) {
return;
}
var viewElementVerticalLocation: CGFloat = startingVerticalLocation;
// var touchUpInside : UIControlEvents = touchUpInside;

let getGPSLongitudeAndLatitudeWithTimeStamp : UIButton = makeAButton(yButtonStart: viewElementVerticalLocation, buttonTitle: "Get GPS Location with TimeStamp", underSubview: nil)
getGPSLongitudeAndLatitudeWithTimeStamp.addTarget(self, action: #selector(setLabelWithGPSLatitudeAndLongitudeWithTimeStampData), for: .touchUpInside)
viewElementVerticalLocation += buttonVerticalSeparation

let getBatteryLevelAndState : UIButton = makeAButton(yButtonStart: viewElementVerticalLocation, buttonTitle: "Get Battery Level and State", underSubview: getGPSLongitudeAndLatitudeWithTimeStamp)
getBatteryLevelAndState.addTarget(self, action: #selector(setLabelWithBatteryLevelAndState), for: .touchUpInside)
viewElementVerticalLocation += buttonVerticalSeparation

let getNextorkImplementation : UIButton = makeAButton(yButtonStart: viewElementVerticalLocation, buttonTitle: "Get Battery Level and State", underSubview: getBatteryLevelAndState)
getNextorkImplementation.addTarget(self, action: #selector(setLabelWithBatteryLevelAndState), for: .touchUpInside)
viewElementVerticalLocation += buttonVerticalSeparation

let displayButtonAction = makeALabel(yLabelStart: viewElementVerticalLocation, underSubview: getNextorkImplementation)
displayButtonAction.text = "No Action Yet"
}

required init(coder aDecoder: NSCoder) {
super.init(nibName: nil, bundle: nil)
initFramingValuesOfMyDisplay()
}
}

最佳答案

您的 displayButtonAction 实际上是 nil。请注意,在您的方法 addButtonAndLabels() 中,您正在创建一个标签并仅在该方法的范围内填充文本:

让 displayButtonAction = makeALabel(yLabelStart: viewElementVerticalLocation, underSubview: getNextorkImplementation)

在您的 makeALabel 方法中,您将该标签作为 View 的 subview 插入,这就是它在您运行应用程序时显示的原因。您没有将该标签分配给 displayButtonAction

总而言之,您正在创建一个本地作用域 UILabel,填充它的占位符文本,将其作为 View 的 subview 插入,然后丢弃它,然后尝试填充您的 的文本按下按钮上的 displayButtonAction 标签为 nil

addButtonAndLabels() 中,通过以下方式将实例化标签分配给 View Controller 主范围内的主标签:

self.displayButtonAction = displayButtonAction

会让您朝着正确的方向开始。

在这种情况下,使用调试器工具、断点和 po 是您的好 helper 。

关于ios - 单击按钮后 UILabel 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43617580/

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