2012-11-09 18 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中沒有任何經驗,再次感謝答案,即使問題有點愚蠢:) –

相關問題