gpt4 book ai didi

ios - XCODE SWIFT 如何在按下按钮后执行代码,但在另一个文件/类中?

转载 作者:行者123 更新时间:2023-12-01 19:30:02 31 4
gpt4 key购买 nike

我正在使用 MapKit,用户可以添加注释。他们可以点击屏幕,提示他们是否要添加带有 UIAlert 的注释,如果他们说是,它会显示另一个 View Controller ,以便用户可以输入有关注释的信息,例如位置名称、描述等. 该 View Controller 在顶部有一个“完成”BarButtonItem 以确认他们输入的信息,并创建注释。

@IBAction func doneButtonPressed(_ sender: UIBarButtonItem) {
doneButtonHasBeenPressed = true
dismiss(animated: true, completion: nil)
}
问题是,必须在原始 View Controller 的“touchesEnded”函数中创建注释,该函数将用户发送到输入注释信息的 View Controller ,因为这是它从中获取 CLCoordinate2D 的地方(使用 touchesEnded )。正是在同一个 touchesEnded 函数中,我将用户发送到下一个 View Controller 。这是 touchesEnded 代码和它使用的辅助函数:
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

if let touch = touches.first {
let touchLocation = touch.location(in: view)

// Converts CGPoint coordinates and UIView to CLLocationCordinate2D (map coordinates) Remember to rename if addButtonPressed order of creation of annotation gets changed!
let coordinatesTouchedToCreateAnnotation = mapView.convert(touchLocation, toCoordinateFrom: view)

if userIsAllowedToAddAnnotation {

let alertController = UIAlertController(title: "Confirm", message: "Are you sure you want to add a jump location here?", preferredStyle: .alert)

let noAction = UIAlertAction(title: "No", style: .cancel, handler: nil)

let yesAction = UIAlertAction(title: "Yes", style: .default) { (action) in

// Segue takes user to JumpSpotCreatorController to input information about the jump location
self.performSegue(withIdentifier: "CreateJumpSpot", sender: self)


if self.jumpSpotCreatorController.doneButtonHasBeenPressed == true {

self.jumpSpotCreatorController.doneButtonHasBeenPressed = false
self.createJumpSpotAnnotation(coordinatesDeterminedByTouch: coordinatesTouchedToCreateAnnotation)
self.userIsAllowedToAddAnnotation = false
self.tapToAddJumpSpotLabel.isHidden = true

}



}
alertController.addAction(noAction)
alertController.addAction(yesAction)

present(alertController, animated: true, completion: nil)

} else {
return
}
}
}

// Force unwrap is okay because this will only be called if 'Done' button is pressed in the JumpSpotCreatorController, which mandates that those inputs not be nil.
func createJumpSpotAnnotation(coordinatesDeterminedByTouch: CLLocationCoordinate2D) {
mapView.addAnnotation(JumpSpotAnnotation(name: jumpSpotCreatorController.nameTextField.text!, coordinate: coordinatesDeterminedByTouch, estimatedHeight: jumpSpotCreatorController.estimatedHeightTextField.text!, locationDescription: jumpSpotCreatorController.descripitionTextView.text, warnings: jumpSpotCreatorController.warningsTextView.text ?? "", image: jumpSpotCreatorController.jumpSpotImageView.image ?? UIImage(imageLiteralResourceName: "Image-1")))
}
如您所见,在 touchesEnded 函数中创建注释的代码块(位于我向 alertController 添加操作的正上方,以防您找不到它。大约 4 行)立即执行,而不是当我需要它时,即在我的另一个 View Controller (JumpSpotCreatorController)中按下“完成”按钮后。我尝试使用 doneButtonHasBeenPressed 变量修复它,但它没有区别(原因很明显)。只有在按下完成按钮后,我才能执行它?我无法将另一个 View Controller 初始化为主视图 Controller 中的一个对象(带有 touchesEnded 的那个是主视图 Controller ),因为它会在两个 View Controller 之间创建一个无限循环的引用。 DispatchQueue 能以某种方式提供帮助吗?我已经研究了几个小时,但不太清楚如何在这里应用它。非常感谢。

最佳答案

如果我做对了,您正试图得到这样的东西:

Class A {
weak var referenceToB: B?
@IBAction func buttonAction(_ sender: Any) {
guard var referenceToB = referenceToB else {
fatalError("referenceToB not set!")
}
referenceToB!.otherFunction()
}
}
Class B {
func otherFunction() {
//stuff
}
}
在您的情况下,在您实例化您的 VC 后,分配一个对包含所需函数的类的对象的引用。

关于ios - XCODE SWIFT 如何在按下按钮后执行代码,但在另一个文件/类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63453586/

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