我有一个UIView我将添加到几个不同的视图(如导航栏)。我应该把我用于每个按钮的选择器放在哪里以保持MVC结构?
我的第一个猜测是创建一个NavButtonsViewController
,但这看起来很时髦,因为我必须在UIView中的某处实例化视图控制器,以便将目标和选择器添加到按钮。或者它应该如何运作?
答案 0 :(得分:1)
我可能会在UITableView
这样的模型上进行建模,并让视图本身处理直接手势但提供协议,以便委托人可以决定应该做什么。
视图的选择器可能只会转发给代理人。
答案 1 :(得分:1)
使用委托来解决这类问题是相当普遍的。带按钮的视图将提供一个委托协议,任何人都可以使用它来定义事件发生的行为。
UINavigationBar和UINavigationBarDelegate是一个寻找类似于你所描述的委托模式的好地方。
答案 2 :(得分:0)
如果视图可重用,我可以在两个解决方案中思考
1 - 在UIView
子类中添加选择器并定义protocol
,其中委托应该处理视图中的操作。
标头文件
@protocol SubviewActionDelegate
@optional
- (void)button1Selected;
@end
@interface Subview: UIView
@property (nonatomic, weak) id<SubviewActionDelegate> delegate
@end
实施档案
[self.button1 addTarget:self action:@selector(buttonSelected:) forControlEvents:UIControlEventTouchUpInside];
...
- (IBAction)buttonSelected:(UIButton *)sender {
if(self.delegate respondsToSelector:@selector(button1Selected)) {
[self.delegate button1Selected];
}
}
将此可重用视图添加为子视图的类应实现此委托并将其自身定义为委托。
2 - 在将视图添加为子视图的同一UIView
或UIViewcontroller
中添加选择器。
Subview *view = [Subview alloc]initWithFrame:CGRectZero];
view.button1 addTarget:self action:@selector(buttonSelected:) forControlEvents:UIControlEventTouchUpInside];
...
- (void)buttonSelected:(id)sender{
NSLog(@"Button selected");
}
现在,如果您在同一个UIViewController
或UIView
容器(例如UITableViewCell
)中拥有多个此类可重复使用的视图,则可以确定哪个视图是您正在查看的视图通过设置视图或按钮tag
值。
[subview.button1 setTag:someValue];
...
- (void)buttonSelected:(UIButton *)sender{
if(sender.tag == someValue) {
//do something
} else {
//do something else
}
希望有所帮助