目标C查看控制器通信

时间:2012-06-07 23:17:13

标签: objective-c model-view-controller

在视图中接受用户输入然后将其传输到该视图的控制器的正确方法是什么?我知道NotificationCenter是一个选项,但肯定有更优雅的方式将数据从视图传输到其控制器?

非常感谢所有帮助,我总是接受答案!

5 个答案:

答案 0 :(得分:2)

通过子类UIControl使用委托协议设计模式或目标操作。想一想UIButton告诉视图控制器它是如何被按下的。在界面构建器中,您将一个操作 - 一个类似于touchUpInside:的选择器连接到目标 - 拥有它的视图控制器。在非IB中,您直接告诉UIButton选择器以及要使用的目标。

这两种方法在不同情况下都有意义。例如,对于UITextField,使用委托更有意义,因为文本字段可以向您发送任意数量的事件,例如用户开始编辑时的事件,结束编辑或键入字符

对于按钮,使用目标动作更有意义,因为实际上只有一个事件以不同的形式表达。

对于滑动和拖动以及其他手势,请使用UIGestureRecognizer s。

答案 1 :(得分:1)

您正在寻找delegation,其中控制器将其自身设置为视图的委托。你知道它来自UITableViewDelegate。

答案 2 :(得分:1)

您正在寻找DelegationData Source。您可以在此处查看有关此内容的更多信息,Delegation and Data Sources

这方面的一个简短例子就是:

  //MyViewSubclass.h

  @protocol MyViewSubclassDelegate
  //Implement your delegate methods here.
  -(void)didTouchView; 
  @end

  @interface MyViewSubclass {

     id<MyViewSubclassDelegate>delegate;
  }
  @property(nonatomic,assign)id<MyViewSubclassDelegate>delegate;

当然,在@synthesize

delegate MyViewSubclass.m

现在在类的标题中,您希望MyViewSubclass的委托是,您需要符合`MyViewSubclassDelegate协议。

 #import "MyViewSubclass.h"
 @interface MyViewController : UIViewController <MyViewSubclassDelegate>

@implementation的{​​{1}}中,实施MyViewController.的{​​{1}}方法。

初始化并创建MyViewSubclassDelegate对象时,请将-(void)didTouchView设置为委托:

MyViewSubclass

MyViewController中,当您准备好转发任何信息,或者只想发布一种方法时,您会myViewSubclass.delegate = self // Self being MyViewController.

希望这有帮助!

答案 3 :(得分:0)

使您的视图成为UIControl的子类并实现目标/操作设计模式 - 使用sendActionsForControlEvents:方法向控制器发送消息。

答案 4 :(得分:0)

UITextField这样的UIKit对象通常具有可以实现业务逻辑的委托方法。例如,UITextField有一个名为- textFieldDidEndEditing:的委托方法,在用户解除键盘后会被调用。