【问题标题】:Delegation - Change variables from different viewsControllers委派 - 从不同的视图控制器更改变量
【发布时间】:2015-02-07 05:32:44
【问题描述】:

我在 container2View 上有一个 UIImageView (img) 作为 IBOutlet。如何更改 img.image 并从其他容器(containerView)刷新视图?

我们必须使用委托

主控制器

class mainController: UIViewController, containerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        switch segue.identifier! {

            case "container":

            var view = segue.destinationViewController as containerController
            view.delegate = self

            break

            default: break
        }
    }

    func change(name: String) {

        println(name)    //prints the name
        container2Controller().img.image = UIImage(named: "name")   //not seems to work
    }
}

容器控制器

protocol containerDelegate {

    func change(name: String)
}

class containerController: UIViewController {

    var delegate: containerDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func click() {

        delegate?.change("hi")    
    }
}

container2Controller

class container2Controller: UIViewController, containerDelegate {

    @IBOutlet var img: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    func change(name: String){

        self.img.image = UIImage(named: name)
    }
}

【问题讨论】:

    标签: swift uiviewcontroller delegates segue uicontainerview


    【解决方案1】:

    您可以使用 delegation 处理此问题。假设container2 有一个按钮,当按下该按钮时应启动对container4 的更新。

    Container2 中,声明一个委托协议,如:

    @protocol Container2Delegate
    - (void) actionDidOccurInContainer2: (Container2) container2;
    @end
    

    并将属性添加到Container2 类:

    @property (weak, nonantomic) id<Container2Delegate> delegate;
    

    然后在 superContainer 中实现委托方法,并将 Container2s 委托设置为 superContainer(如果您使用故事板,则在 prepareForSegue )。

    在方法实现中,可以更新Container4

    - (void) actionDidOccurInContainer2: (Container2) container2 {
         container4.imageView.image = <your image>
    }
    

    container2 中,您将拥有类似的内容:

    - (IBAction)doSomething: (id) sender
    {
        [self.delegate actionDidOccurInContainer2: self];
    }
    

    【讨论】:

    • 感谢您的回答。我用一个简单的代码更新了这个问题。我正在用 Swift 做这件事,所有的视图都是同时加载/显示的,所以当你说“在 prepareForSegue 中”时,我不明白。你能填写我剩下的代码吗?
    • 听起来您需要先阅读(和理解)Apple 的文档,然后再继续。你查过prepareForSegue 方法吗?你试过看看发生了什么吗?你读过委托协议吗?您是否尝试按照我的描述实现一个? (语言不重要,原理都是一样的)。一旦你自己试验过,回来就你尝试过的代码提出问题,让我们知道什么有效,什么无效,你会得到更多帮助。我们不是来为你编码的。
    • 首先抱歉,这不是我的本意。我知道 prepareForSegue 它用于在视图之间传递数据。我尝试按照您的步骤进行操作,并且我之前读过它,但是对于代表,我有一些不明白的地方:Cloud,您向我解释得这么陡峭吗? '然后在 superContainer 中实现委托方法,并将 Container2s 委托设置为 superContainer(如果您使用情节提要,则在 prepareForSegue 中)。无论如何,我会为自己努力。感谢您的帮助。
    • 好的,所以在你的故事板中,每个子容器视图控制器都有一个关联的嵌入segue - 你的第一步是给每个子容器一个唯一的标识符(例如 EmbedContainer1 等)。然后覆盖主视图控制器中的prepareForSegue: 方法,您将看到为每个嵌入式控制器触发的segue。届时您可以致电segue.destinationViewController(setDelegate: self)
    • 我按照您的指示,研究了一些关于 segue 和委托 (goo.gl/1SQq8M) 但我自己却无法理解的东西:Protocol 的 func change() 应该在我的 container2Controller 或 mainController 上实现,因为如果你使用 containerDelegate 我必须实现它。我更新了代码,但似乎不起作用。
    猜你喜欢
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多