1

我正在关注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;
4

1 回答 1

1

首先,您的代码中有一个无限递归:

-(id <UISplitViewControllerDelegate>)splitViewBarButtonItemPresenter
{
    id detailVC = [self.splitViewController.viewControllers lastObject];
    if(![detailVC conformsToProtocol:@protocol(SplitViewBarButtonItemPresenter)]){
        detailVC = nil;
    }
    return [self splitViewBarButtonItemPresenter] ? UIInterfaceOrientationIsPortrait(UIInterfaceOrientation) : NO;
}

该方法在 return 语句中调用自身,并且没有中止条件。其次,即使该方法会返回一个值,它也会返回 aBOOL但它应该返回一个id<UISplitViewControllerDelegate>

第三,要么方法的返回类型错误,要么名称具有误导性。您有一个名为的协议SplitViewBarButtonItemPresenter,该方法的名称是splitViewBarButtonItemPresenter. 所以从名字上我希望它返回一个id<SplitViewBarButtonItemPresenter>not an id<UISplitViewControllerDelegate>

最后但并非最不重要的一点是,您的SplitViewBarButtonItemPresenter协议不是由CalculatorViewController.

因此,您的代码存在很多问题,我建议您更频繁地检查。

于 2012-11-09T11:02:18.197 回答