在'id <uisplitviewcontrollerdelegate>'</uisplitviewcontrollerdelegate>类型的对象上找不到属性'splitViewBarButtonItem'

时间:2012-11-09 10:50:29

标签: iphone objective-c ios xcode ipad

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

1 个答案:

答案 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协议。

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