对于iOS开发,如果在运行时创建并添加子视图,您将如何允许它与视图控制器通信?由于子视图未在nib中实例化,因此无法使用Interface Builder将连接拖动到控制器上的IBAction
方法。我看不到从视图中抓取控制器句柄的明显方法。或者我是以错误的方式看待它,而应该通过NSNotificationCenter
间接与它进行通信?
答案 0 :(得分:0)
你想要沟通什么? IBActions用于预定义(或者如果你想通过向UI添加你的UI元素的麻烦而新定义)可以在某些交互时触发某些选择器的UI元素,因为你总是可以以编程方式获得相同的效果...例如,要在运行时创建一个UIButton,你可以做..
UIButton *button=[[UIButton alloc] initWithFrame:frame];
[button addTarget:self action:@selector(myAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
您可以在界面构建器中执行的任何操作也可以以编程方式执行...您只需要查找将操作绑定到UI元素的方法...希望这会有所帮助。
阅读评论后: 您可以考虑从视图控制器而不是视图创建按钮,可能是正确的方法(尽管不知道您的情况)...如果没有,则视图可以处理您的事件并使用协议将事件委托给视图控制器,或者您可以使用协议注册为UI元素的目标,有很多方法可以解决您的问题,您的情况如何?
答案 1 :(得分:0)
大多数视图不直接与视图控制器通信。相反,它们连接到IBOutlet,或者使用target-action来调用视图控制器上的方法。
对于前者,只需像往常一样声明一个IBOutlet属性,并在创建视图后设置它。 (请注意,从技术上讲,您不需要IBOutlet关键字,因为您没有在IB中建立连接,但我认为它不会造成任何伤害。)
self.myViewOutlet = myNewView;
如果您的UIView是UIControl的子类,请使用addTarget: action: forControlEvents:在控件上发生某些事件时调用视图控制器的方法。
[myNewControl addTarget:self action:@selector(mySelector:) forControlEvents:UIControlEventTouchDragInside];
答案 2 :(得分:0)
我自己回答......我是在父视图中创建这些子视图,因此也无法访问控制器,所以其他答案的代码示例中的self
是不可能的。但是在考虑了一下之后,我决定将代码移动到控制器本身,而是选择使用委托而不是目标动作,因为它是自定义消息,而不仅仅是简单的触摸事件。感谢那些帮助过的人。