在iOS中,我正在使用Swift构建应用程序。我有一个视图,其中设置了容器视图,链接嵌入视图。这是使用Storyboard设置的。
如何在Swift代码中的视图之间设置委托关系,以便我可以在另一个视图中发送消息/触发器功能?
任何帮助将不胜感激!
答案 0 :(得分:6)
假设您有两个观看次数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
}
注意:这只是两个类之间快速授权的粗略概念,您可以根据自己的要求对其进行自定义。
答案 1 :(得分:0)
为嵌入segue创建唯一标识符。
在父视图控制器中,实现prepareForSegue方法。
使用switch语句匹配segue标识符。对于包含的视图控制器,从segue获取目标视图控制器属性,将其强制转换为自定义目标视图控制器的类型,并设置它的委托属性。
如果您需要一种持续发送父对子消息的方法,还应该在prepareForSegue中保存指向子视图控制器的指针。
(您还需要定义一个协议,以便从子进程与父进行通信,并设置父进程以符合该协议。您应该为委托属性使用“委托”以外的名称。它是`ParentVCDelegate'(因为许多像UITableViewController这样的Apple类已经有了委托属性。)
答案 2 :(得分:0)
我觉得你真的想在这里使用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 是一种更合适的数据传递方法。