【问题标题】:Swift delegates - Newbie 3 ViewControllersSwift 代表 - 新手 3 ViewControllers
【发布时间】:2015-12-28 03:01:31
【问题描述】:

所以这是我的问题。 我从 Swift 和 C# 开始了我的旅程,我正在尝试以最简单的方式学习委托。

我创建了一个 xcode 项目,在其中设置了 3 个视图控制器。 我创建了 2 个转场:

  1. 我可以从 firstViewController (firstVC) 转到 secondViewController (secondVC)
  2. 我可以从 firstViewController 转到thirdViewController (thirdVC)

应用目的:

  1. 从 firstVC 转到 secondVC,点击一个按钮,关闭视图并根据点击的按钮更新标签。 -- 这个很简单。

  2. 从第一个 VC 转到第三个 VC,点击那里唯一的按钮,关闭视图并使用一些简单的文本更新与以前相同的标签 -- 这也完成了。

  3. 如果我点击 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


【解决方案1】:

请通过在 if else 条件中添加断点来检查以下代码是否正常工作。

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
    }
}

还要检查您是否为情节提要中的 segue 提供了正确的 segue 标识符。 "firstToSecondSegue" 和 "firstToThirdSegue"

【讨论】:

  • 它正在运行。我的意思是:SecondVC 连接到 FirstVC,ThirdVC 也连接到 FirstVC。但是如何将 ThirdVC 连接到 SecondVC 而无需在它们之间创建 segue?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多