我正在关注使用Stanford cs193p lesson 7
和协议的SplitViewControllers
。
我正在做与教授一样的事情(多次检查),但我一遍又一遍地得到这个错误。
我在SplitViewBarButtonItemPresenter.h
#import <UIKit/UIKit.h>
@protocol SplitViewBarButtonItemPresenter <NSObject>
@property (nonatomic,strong) UIBarButtonItem *splitViewBarButtonItem;
@end
在我的主人CalculatorViewController.h
中@interface CalculatorViewController : UIViewController <UISplitViewControllerDelegate>
在CalculatorViewController.m中
-(id <UISplitViewControllerDelegate>)splitViewBarButtonItemPresenter
{
id detailVC = [self.splitViewController.viewControllers lastObject];
if(![detailVC conformsToProtocol:@protocol(SplitViewBarButtonItemPresenter)]){
detailVC = nil;
}
return detailVC;
}
- (void)awakeFromNib
{
[super awakeFromNib];
super.splitViewController.delegate = self;
}
以后我尝试设置barButtonItem
-(void)splitViewController:(UISplitViewController *)svc
willHideViewController:(UIViewController *)aViewController
withBarButtonItem:(UIBarButtonItem *)barButtonItem
forPopoverController:(UIPopoverController *)pc
{
barButtonItem.title = self.title;
[self splitViewBarButtonItemPresenter].splitViewBarButtonItem = barButtonItem;
}
我一直在标题中收到错误,好像我没有正确声明协议和委托。我真的不知道在哪里可以找到错误,因为我正在跟踪斯坦福大学的教授一行一行地逐字逐句。 错误在这一行,特别是:
[self splitViewBarButtonItemPresenter].splitViewBarButtonItem = barButtonItem;
答案 0 :(得分:1)
首先,您的代码中有无限递归:
-(id <UISplitViewControllerDelegate>)splitViewBarButtonItemPresenter
{
id detailVC = [self.splitViewController.viewControllers lastObject];
if(![detailVC conformsToProtocol:@protocol(SplitViewBarButtonItemPresenter)]){
detailVC = nil;
}
return [self splitViewBarButtonItemPresenter] ? UIInterfaceOrientationIsPortrait(UIInterfaceOrientation) : NO;
}
该方法在return语句中调用自身,并且没有中止条件。
其次,即使该方法返回一个值,它也会返回一个BOOL
,但它应该返回一个id<UISplitViewControllerDelegate>
。
第三,方法的返回类型错误或名称误导。您有一个名为SplitViewBarButtonItemPresenter
的协议,方法名称为splitViewBarButtonItemPresenter
。因此,从名称我希望它返回id<SplitViewBarButtonItemPresenter>
而不是id<UISplitViewControllerDelegate>
。
最后但同样重要的是,SplitViewBarButtonItemPresenter
未实施CalculatorViewController
协议。
因此,您的代码存在很多问题,我建议更频繁地检查一下。