【发布时间】:2015-12-28 03:01:31
【问题描述】:
所以这是我的问题。 我从 Swift 和 C# 开始了我的旅程,我正在尝试以最简单的方式学习委托。
我创建了一个 xcode 项目,在其中设置了 3 个视图控制器。 我创建了 2 个转场:
- 我可以从 firstViewController (firstVC) 转到 secondViewController (secondVC)
- 我可以从 firstViewController 转到thirdViewController (thirdVC)
应用目的:
从 firstVC 转到 secondVC,点击一个按钮,关闭视图并根据点击的按钮更新标签。 -- 这个很简单。
从第一个 VC 转到第三个 VC,点击那里唯一的按钮,关闭视图并使用一些简单的文本更新与以前相同的标签 -- 这也完成了。
如果我点击 thirdVC 中的按钮,我想更改 secondVC 中的标签
第三个对我来说并不容易。
代码如下:
FirstViewController:
import UIKit
class FirstViewController: UIViewController, SecondViewControllerDelegate, ThirdViewControllerDelegate {
@IBOutlet weak var answerLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "firstToSecondSegue" {
let secondVC = segue.destinationViewController as! SecondViewController
secondVC.delegate = self
} else if segue.identifier == "firstToThirdSegue" {
let thirdVC = segue.destinationViewController as! ThirdViewController
thirdVC.delegate = self
}
}
@IBAction func answerButtonTapped(sender: UIButton) {
if sender.tag == 0 {
performSegueWithIdentifier("firstToSecondSegue", sender: self)
} else if sender.tag == 1 {
performSegueWithIdentifier("firstToThirdSegue", sender: self)
}
}
func giveTheAnswer(yes: Bool) {
if yes {
print("Yes is the answer")
self.answerLabel.text = "I do like chicken!"
} else {
print("No is the answer")
self.answerLabel.text = "I do not like chicken!"
}
}
func iWantPie(kindOfPie: String, disableButton: Bool) {
if kindOfPie == "Apple pie" {
print("Textlabel will change to applepie.")
self.answerLabel.text = "Fu*k chicken. Let's eat apple pie!"
}
if disableButton {
print("DisableButton set to true")
self.answerLabel.backgroundColor = UIColor.redColor()
}
}
}
SecondViewController:
protocol SecondViewControllerDelegate {
func giveTheAnswer(yes: Bool)}
class SecondViewController: UIViewController, ThirdViewControllerDelegate {
@IBOutlet weak var theOnlyLabel: UILabel!
@IBOutlet weak var yesButton: UIButton!
@IBOutlet weak var noButton: UIButton!
var delegate: SecondViewControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func answerButtonPressed(sender: UIButton) {
if sender.tag == 0 {
//Yes tapped
self.delegate?.giveTheAnswer(true)
dismissViewControllerAnimated(true, completion: nil)
} else if sender.tag == 1 {
//No Tapped
self.delegate?.giveTheAnswer(false)
dismissViewControllerAnimated(true, completion: nil)
}
}
func iWantPie(kindOfPie: String, disableButton: Bool) {
print("Function iWantPie in secondViewController is Running")
if disableButton == true {
print("DisableButton running")
self.theOnlyLabel.text = "Pie was tapped"
}
}}
第三视图控制器:
protocol ThirdViewControllerDelegate {
func iWantPie(kindOfPie: String, disableButton: Bool)}
class ThirdViewController: UIViewController {
var delegate: ThirdViewControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func piePressed(sender: UIButton) {
self.delegate?.iWantPie("Apple pie", disableButton: true)
dismissViewControllerAnimated(true, completion: nil)
}}
【问题讨论】:
-
你好,我看不出SeconVC 和ThirdVC 同时存在吗?
-
意思是你想在第3个按btn,然后回到第1个然后去第2个看看变化?如果是,那么流程是一样的,但是在第一次你不更新任何东西,而是将它传递给第二个,你不能真正调用第二个委托,因为如果你不从第二个去第三个,它就没有初始化
-
正如@view vu 所指出的那样,我认为在segue 堆栈中没有第二个和第三个VC 的可能性。你要么从 1->2 要么 1->3,除了你在代码中提到的那些之外,还有其他的 segue 吗?
-
本例中没有 Objective-C。可以去掉 Objective-C 标签吗?
标签: ios objective-c iphone swift