2012-11-09 24 views
1

我正在关注使用SplitViewControllers和协议的Stanford cs193p lesson 7。 我正在做同样的教授正在做的事情(多次检查),但我一遍又一遍地得到这个错误。在'id <UISplitViewControllerDelegate>'对象上未找到属性'splitViewBarButtonItem''

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

有关错误的更多详细信息请 – jimpic

+0

当我尝试使用点符号来设置splitViewBarButtonItem –

回答

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实施的。

所以,你的代码有很多问题,我建议更频繁地检查。

+0

非常感谢你!关于无限递归,我想我把它搞砸在这里:它只是'return detailVC;'。 导致错误的原因是'SplitViewBarButtonItem'方法的返回类型。 我只注意到它不依赖于协议(不同的视图被设置为稍后的'SplitViewBarButtonItemPresenter'的代理)。 我在obj-c和iOS中没有任何经验,再次感谢答案,即使问题有点愚蠢:) –

相关问题