Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS@protocol作为一种;标记";视图控制器_Ios_Objective C_Protocols - Fatal编程技术网

iOS@protocol作为一种;标记";视图控制器

iOS@protocol作为一种;标记";视图控制器,ios,objective-c,protocols,Ios,Objective C,Protocols,在我的应用程序中,每次在堆栈上推一个新的ViewController时,我都需要在UINavigationBar中对BarButtonims进行一些更改。我在UINavigationController委托方法中执行此操作 -navigationController: willShowViewController: animated: 但也有一些例外。我需要一种方法来“标记”两个不需要这些更改的ViewController。在导航堆栈中查找它们是一件痛苦的事情。因此,我想不出比声明一个没有方法

在我的应用程序中,每次在堆栈上推一个新的ViewController时,我都需要在UINavigationBar中对BarButtonims进行一些更改。我在UINavigationController委托方法中执行此操作

-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: