现在我正在使用委托,但我怀疑这是不好的形式。
我以编程方式在许多不同的视图控制器中创建相同的UIBarButtonItem
。
我的按钮的目标是myAppDelegate
,它的动作在其中定义。
做这件事的更好的方法是什么?或者我只是应该复制和粘贴相同的操作到,无论有多少视图控制器实例化相同的栏按钮?
好,现在假设动作在所有方面都是相同的,除了一个:它的变化只在于它应该发送一个presentViewController消息给实例化发送动作的按钮的视图控制器。因此,在动作中,我可以发送presentViewController
消息到sender
,这是按钮的实例,但我知道没有办法到达实例化按钮实例的视图控制器。
每个视图控制器只需要在创建按钮时将自己设置为按钮的目标。按钮的动作选择器将被发送到正确的控制器。
至于选择器本身,在UIViewController
上创建一个类别来包含按钮的动作:
@implemenation UIViewController (MKCBarButtonItemAction)
- (void)MKCDoThatThingIDo
{
// Do things.
[self presentViewController:[self theOtherViewControllerWhatINeedToDisplay]
animated:YES
completion:^{
// Do more things.
}];
// Do yet other things.
}
@end
如果你在AppDelegate
文件中定义了多个视图控制器的通用方法,那么你可以使用委托对象来调用这些操作,比如
#define appDelegateObj (AppDelegate *)[UIApplication sharedApplication].delegate;
其中,AppDelegate
是你的委托文件类名,也在全局定义这个宏,这样你就可以从任何地方访问它,
现在无论何时你想调用任何函数,只要使用像[appDelegateObj functionName];
这里有一件事,如果你可以把类方法变成委托文件,那么它可以使用使用类名,如[AppDelegate functionName];
类方法定义如+(void)functionName{...}
,它不能访问类实例变量和方法