【发布时间】:2015-06-30 05:48:36
【问题描述】:
在 iOS 中,我正在用 Swift 构建一个应用程序。我有一个视图,其中设置了一个容器视图,链接了一个嵌入式视图。这是使用 Storyboards 设置的。
如何在 Swift 代码中的视图之间建立委托关系,以便我可以在一个视图中从另一个视图发送消息/触发函数?
任何帮助将不胜感激!
【问题讨论】:
标签: ios swift delegates uicontainerview
在 iOS 中,我正在用 Swift 构建一个应用程序。我有一个视图,其中设置了一个容器视图,链接了一个嵌入式视图。这是使用 Storyboards 设置的。
如何在 Swift 代码中的视图之间建立委托关系,以便我可以在一个视图中从另一个视图发送消息/触发函数?
任何帮助将不胜感激!
【问题讨论】:
标签: ios swift delegates uicontainerview
假设您有两个视图 ViewA 和 ViewB
ViewB 的实例是在ViewA 内部创建的,所以ViewA 可以向ViewB's 实例发送消息,但是相反的情况我们需要实现委托(以便使用委托ViewB's 实例可以发送给 ViewA 的消息)
按照这些步骤来实现委托
1) 在ViewB 中创建协议为
protocol ViewBDelegate{
func delegateMethod(controller:ViewB, text:String)
}
2) 在发送者类中声明委托
class ViewB: UIView {
var delegate: ViewBDelegate! = nil
}
3) 使用类中的方法调用委托方法为
@IBAction func callDelegateMethod(sender : UIBarButtonItem) {
delegate!. delegateMethod(self, text: colorLabel.text)
//assuming the delegate is assigned otherwise error
}
4) 采用ClassA中的协议
class ViewA: UIView, ViewBDelegate {
5) 实现委托
func delegateMethod(controller: ViewB, text: String) {
label.text = "The text is " + text
}
6) 设置委托
override func anyFuction()
{
// create ViewB instance and set the delegate
viewB.delegate = self
}
注意 :这只是两个类之间 swift 委托的粗略想法,您可以根据自己的需要进行自定义。
【讨论】:
为您的嵌入转场创建一个唯一标识符。
在父视图控制器中,实现prepareForSegue方法。
使用 switch 语句来匹配 segue 标识符。对于包含的视图控制器,从 segue 获取目标视图控制器属性,将其转换为自定义目标视图控制器的类型,并将其设置为委托属性。
如果您需要一种持续发送父子消息的方法,您还应该在 prepareForSegue 中保存指向子视图控制器的指针。
(您还需要定义一个协议以从子级与父级进行通信,并设置父级以符合该协议。您应该为委托属性使用“delegate”以外的名称。假设您调用它是 `ParentVCDelegate" (因为很多 Apple 的类,比如 UITableViewController 已经有一个委托属性。)
【讨论】:
我想你真的想在这里使用 segue 吗?在之前的项目中,我制作了一个重载的 UIView 控制器,它将数据从控制器传递到控制器。
我们有一个名为 RestFlightVariables 的数据容器类和另一个名为 rest 的容器,它们都存储了要在控制器之间传递的特定信息。
然后我们创建了RESTUIViewController,它有一个重载的prepareForSegue 函数。如果控制器所连接的类也是 RESTUIViewController,则将传递变量 rest 和 restVars。
/**
RESTUIViewController is an overloaded UIVIewcontroller that handles the passing of REST variables between view controllers
*/
class RESTUIViewController : ResponsiveTextFieldViewController {
var rest : RESTInterface?
var restVars : RESTFlightVariables?
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
print("----- RESTUIViewController Segue -----")
let nextVC = segue.destinationViewController as RESTUIViewController
nextVC.rest = self.rest
nextVC.restVars = self.restVars
}
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.
}
}
另一种选择可能是使用 NSNotification 系统,但是当您在视图之间传递数据时,这并不合适。 Segues 是一种更合适的数据传递方法。
【讨论】: