2012-06-07 41 views
0

在视图中接受用户输入并将其转移到该视图的控制器的正确方法是什么?我知道NotificationCenter是一种选择,但肯定有更好的方法将数据从视图传输到控制器?Objective C查看到控制器通信

所有帮助非常感谢,我始终接受一个答案!

回答

1

您正在寻找Delegation或者Data 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; 

当然,@synthesizedelegateMyViewSubclass.m

现在该类的头部,你想要MyViewSubclass的代表,你需要符合`MyViewSubclassDelegate协议。

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

在你@implementationMyViewController.,实施-(void)didTouchViewMyViewSubclassDelegate方法。

当初始化并创建MyViewSubclass对象,设置MyViewController为代表:

myViewSubclass.delegate = self // Self being MyViewController. 

在你MyViewSubclass,当你准备好任何信息转发,或者只是想火的方法你会做[self.delegate didTouchView]

希望这会有所帮助!

+0

是的,这似乎是我正在寻找。使用@protocol而不是仅引用self.delegate有什么好处? – danielmhanover

+0

太棒了!很高兴我能提供帮助,如果这足以作为你问题的解决方案,请检查它,因为:) – skram

+0

使用@protocol代替引用委托的好处可以更好地控制委托行为。我,电子邮件:在协议中添加@required告诉您的委托,该方法是必需的,并给你一个警告,它不存在。其中包括诸如'-conformsToProtocol:'来检查一个类IS是否确实是你的对象的一个​​委托。 – skram

2

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

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

对于一个按钮,使用target-action更有意义,因为实际上只有一个事件以不同形式表达。

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

+0

问题是,我想以触摸和拖动的形式接受用户输入,而不是按钮。我怎么做? – danielmhanover

+0

我只是用'UIButton'作为例子。你可能想把'UIGestureRecognizer'添加到你的视图中。 –

1

您正在寻找delegation,其中控制器将自己设置为视图的代表。你从UITableViewDelegate知道它。

0

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

0

通常UIKit对象(如UITextField)具有您可以实现以执行业务逻辑的委托方法。 E.g UITextField有一个名为- textFieldDidEndEditing:的委托方法,在用户解散键盘后被调用。