【发布时间】:2012-06-13 21:53:09
【问题描述】:
在视图中接受用户输入然后将其传输到该视图的控制器的正确方法是什么?我知道 NotificationCenter 是一种选择,但肯定有更优雅的方式将数据从视图传输到其控制器?
非常感谢所有帮助,我总是接受答案!
【问题讨论】:
标签: objective-c model-view-controller
在视图中接受用户输入然后将其传输到该视图的控制器的正确方法是什么?我知道 NotificationCenter 是一种选择,但肯定有更优雅的方式将数据从视图传输到其控制器?
非常感谢所有帮助,我总是接受答案!
【问题讨论】:
标签: objective-c model-view-controller
使用委托协议设计模式,或通过子类化UIControl 来实现目标操作。想想UIButton 如何告诉视图控制器它已被按下。在界面生成器中,您将一个操作(类似于touchUpInside: 的选择器)连接到一个目标(拥有它的视图控制器)。在非 IB 中,您直接告诉 UIButton 使用什么选择器和目标。
这两种方法在不同的情况下都有意义。例如,对于UITextField,使用委托更有意义,因为文本字段可以向您发送任意数量的事件,例如用户开始编辑、结束编辑或键入字符时的事件。
对于按钮,使用 target-action 更有意义,因为实际上只有一个事件以不同的形式表示。
对于滑动和拖动以及其他手势,请使用UIGestureRecognizers。
【讨论】:
UIButton 为例。您可能希望将UIGestureRecognizers 添加到您的视图中。
您正在寻找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;
当然,@synthesize 你的delegate 在MyViewSubclass.m
现在在类的标题中,您希望 MyViewSubclass 的委托是,您需要遵守 `MyViewSubclassDelegate 协议。
#import "MyViewSubclass.h"
@interface MyViewController : UIViewController <MyViewSubclassDelegate>
在MyViewController. 的@implementation 中,实现-(void)didTouchView 的MyViewSubclassDelegate 方法。
当您初始化和创建 MyViewSubclass 对象时,您将 MyViewController 设置为委托:
myViewSubclass.delegate = self // Self being MyViewController.
在您的MyViewSubclass 中,当您准备好转发任何信息,或者只是想触发您会执行的方法[self.delegate didTouchView]
希望这会有所帮助!
【讨论】:
-conformsToProtocol: 检查类 IS 是否确实是您的对象的 delegate。
@rdelmar 我相信你误解了他的问题。他不想使用buttons,他想检测视图的触摸。如果他想使用按钮,他当然可以使用UIButton 的-addTarget:action:forControlEvents: 方法。但是,我认为情况并非如此。
您正在寻找delegation,其中控制器将自己设置为视图的委托。你从 UITableViewDelegate 就知道了。
【讨论】:
使您的视图成为UIControl 的子类并实现目标/动作设计模式 - 使用sendActionsForControlEvents: 方法向控制器发送消息。
【讨论】:
通常,像UITextField 这样的 UIKit 对象具有委托方法,您可以实现这些方法来执行您的业务逻辑。例如 UITextField 有一个名为 - textFieldDidEndEditing: 的委托方法,该方法在用户关闭键盘后被调用。
【讨论】: