iOS@protocol作为一种;标记";视图控制器
在我的应用程序中,每次在堆栈上推一个新的ViewController时,我都需要在UINavigationBar中对BarButtonims进行一些更改。我在UINavigationController委托方法中执行此操作iOS@protocol作为一种;标记";视图控制器,ios,objective-c,protocols,Ios,Objective C,Protocols,在我的应用程序中,每次在堆栈上推一个新的ViewController时,我都需要在UINavigationBar中对BarButtonims进行一些更改。我在UINavigationController委托方法中执行此操作 -navigationController: willShowViewController: animated: 但也有一些例外。我需要一种方法来“标记”两个不需要这些更改的ViewController。在导航堆栈中查找它们是一件痛苦的事情。因此,我想不出比声明一个没有方法
-navigationController: willShowViewController: animated:
但也有一些例外。我需要一种方法来“标记”两个不需要这些更改的ViewController。在导航堆栈中查找它们是一件痛苦的事情。因此,我想不出比声明一个没有方法的协议并将其用作“标记”更好的方法了。如果我不想更改,我的ViewController需要符合此协议
if ([viewController conformsToProtocol:@protocol(CustomMarker)]) {
//don't do my stuff
} else {
//do my stuff
}
这是实现我目标的好方法吗?有更好的实践吗?我宁愿使用isKindOfClass而不是protocol:
if ([viewController isKindOfClass:[MyViewController class]])
只需将MyViewController替换为要测试它的类即可
但正如@Wain所说,如果要测试视图控制器的负载,那么使用协议就更容易了,因为您将只使用一个if语句
在我的解决方案中,您必须测试每个视图控制器。是的,当然,协议是对象之间进行通信的好技术,
下面是我如何使用它的一个例子
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
[super prepareForSegue:segue sender:sender];
// If destination is NewsAcceptor than sending news data
if ([segue.destinationViewController conformsToProtocol:@protocol(AFMagnoliaNodeAcceptor)]) {
[(id<AFMagnoliaNodeAcceptor>)segue.destinationViewController setNode:sender];
}
..... Other stuff
}
-(void)prepareforsgue:(UIStoryboardSegue*)分段发送方:(id)发送方
{
[超级准备用户:序列发送方:发送方];
//如果目标是新闻接受者,则发送新闻数据
if([segue.destinationViewController conformsToProtocol:@protocol(afmagnoliandeaceptor)]){
[(id)segue.destinationViewController设置节点:发送方];
}
……其他东西
}
这段代码是在Base-ViewController中编写的,所以如果我想在ViewController之间传递node对象,那么我用protocol
afmagnolianodeaceptor
标记我的viewControlelr,这样对象就会自动传递到那里。什么是“东西”?将来还会有更多的特殊情况吗?这些特殊情况是否需要来自视图控制器的一些信息?我想我倾向于向视图控制器添加一个方法,比如-(BOOL)requiresBarButtonModification
。您可以将此方法添加到UIViewController的子类中,默认值为YES
,然后在VC异常中重写该方法以返回NO
“stuff”表示将后退按钮更改为自定义按钮。我想不出有哪种情况需要viewController的信息,因为它需要或不需要这个自定义按钮。@mttrb这正是我最初所做的,但协议似乎是一个更容易实现的解决方案。我没有提到我已经做了这个协议的事情,它工作得非常完美。我只是想知道是否有更好的方法,或者我将要面对我的方法的任何已知问题。这是我想到的第一个想法。但以这种方式,我必须从自定义UIViewController子类(而不是通用UIViewController)中将我的所有“异常”子类化,这似乎比我使用protocol时多了一步。与conformsToProtocol相比,使用isKindOfClass是否有好处?对于发送消息,最好使用respondsToSelector: