设置两个视图之间的委托关系并发送消息
Set up Delegate relationship between two views and send messages
在 iOS,我正在 Swift 构建应用程序。我有一个视图,其中设置了一个容器视图,链接了一个嵌入式视图。这是使用故事板设置的。
如何在 Swift 代码中设置视图之间的委托关系,以便我可以在一个视图中从另一个视图发送消息/触发函数?
如有任何帮助,我们将不胜感激!
为您的嵌入转场创建一个唯一标识符。
在父视图控制器中,实现 prepareForSegue 方法。
使用 switch 语句来匹配 segue 标识符。对于包含的视图控制器,从 segue 中获取目标视图控制器 属性,将其转换为自定义目标视图控制器的类型,并将其设置为委托 属性.
如果您需要一种持续发送父子消息的方法,您还应该在 prepareForSegue 中保存指向子视图控制器的指针。
(您还需要定义从子级到父级的通信协议,并设置父级以符合该协议。您应该为委托使用 "delegate" 以外的名称 属性。假设你称它为“ParentVCDelegate”(因为很多 Apple 的 类,比如 UITableViewController 已经有一个委托 属性。)
假设您有两个视图 ViewA
和 ViewB
ViewB
的实例是在 ViewA
中创建的,因此 ViewA
可以将消息发送到 ViewB's
实例,但要发生相反的情况,我们需要实施委托(这样使用委托 ViewB's
实例可以将消息发送到 ViewA)
按照以下步骤实施授权
1) 在 ViewB
中创建协议为
protocol ViewBDelegate{
func delegateMethod(controller:ViewB, text:String)
}
2) 在sender中声明委托class
class ViewB: UIView {
var delegate: ViewBDelegate! = nil
}
3) 使用class中的方法调用委托方法为
@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
}
注意 : 这只是两个class之间swift中委托的粗略想法,您可以根据需要自定义它。
我想你真的想在这里使用 segue 吗?在之前的项目中,我制作了一个重载的 UIView 控制器,它将数据从控制器传递到控制器。
我们有一个名为 RestFlightVariables
的数据容器 class 和另一个名为 rest
的容器,它们都存储了要在控制器之间传递的特定信息。
然后我们创建了 RESTUIViewController
,它有一个重载的 prepareForSegue
函数。如果 class 控制器转至的也是 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 是一种更合适的数据传递方法。
在 iOS,我正在 Swift 构建应用程序。我有一个视图,其中设置了一个容器视图,链接了一个嵌入式视图。这是使用故事板设置的。
如何在 Swift 代码中设置视图之间的委托关系,以便我可以在一个视图中从另一个视图发送消息/触发函数?
如有任何帮助,我们将不胜感激!
为您的嵌入转场创建一个唯一标识符。
在父视图控制器中,实现 prepareForSegue 方法。
使用 switch 语句来匹配 segue 标识符。对于包含的视图控制器,从 segue 中获取目标视图控制器 属性,将其转换为自定义目标视图控制器的类型,并将其设置为委托 属性.
如果您需要一种持续发送父子消息的方法,您还应该在 prepareForSegue 中保存指向子视图控制器的指针。
(您还需要定义从子级到父级的通信协议,并设置父级以符合该协议。您应该为委托使用 "delegate" 以外的名称 属性。假设你称它为“ParentVCDelegate”(因为很多 Apple 的 类,比如 UITableViewController 已经有一个委托 属性。)
假设您有两个视图 ViewA
和 ViewB
ViewB
的实例是在 ViewA
中创建的,因此 ViewA
可以将消息发送到 ViewB's
实例,但要发生相反的情况,我们需要实施委托(这样使用委托 ViewB's
实例可以将消息发送到 ViewA)
按照以下步骤实施授权
1) 在 ViewB
中创建协议为
protocol ViewBDelegate{
func delegateMethod(controller:ViewB, text:String)
}
2) 在sender中声明委托class
class ViewB: UIView {
var delegate: ViewBDelegate! = nil
}
3) 使用class中的方法调用委托方法为
@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
}
注意 : 这只是两个class之间swift中委托的粗略想法,您可以根据需要自定义它。
我想你真的想在这里使用 segue 吗?在之前的项目中,我制作了一个重载的 UIView 控制器,它将数据从控制器传递到控制器。
我们有一个名为 RestFlightVariables
的数据容器 class 和另一个名为 rest
的容器,它们都存储了要在控制器之间传递的特定信息。
然后我们创建了 RESTUIViewController
,它有一个重载的 prepareForSegue
函数。如果 class 控制器转至的也是 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 是一种更合适的数据传递方法。