2012-02-16 49 views
0

我正在開發一個包含多個視圖的簡單應用程序。 我有一個基礎視圖和第二個視圖,在基礎之後調用。 基本視圖充當第二個視圖的代表。iOS:從代理獲取實例變量值(屬性)

我想在第二個視圖中設置和檢索baseView('name')中的屬性值。 因爲在第二個視圖中,委託是secondViewDelegate對象,所以它沒有'name'方法。

baseView.h(跳過進口):

@interface baseView : UIViewController <secondViewDelegate> { 
} 
@property (retain) NSString *name; 

@end 

secondView.h(跳過進口):

@protocol secondViewDelegate; 

@interface secondView : UIViewController{ 
} 
@property (nonatomic,assign) id <secondViewDelegate> delegate; 

@end 

@protocol secondViewDelegate 
- (void) secondViewDidFinish:(secondView *)controller; 
@end 

什麼是這裏通常的做法? 我真的需要爲協議實現一個getter和setter嗎?像:

@protocol secondViewDelegate 
- (void) secondViewDidFinish:(secondView *)controller; 
- (NSString *)getName; 
- (void)setName:(NSString *)newName; 
@end 

或者有沒有什麼好的方法來實際訪問baseView屬性,或至少得到實例? (這是一個好主意嗎?)

我對iOS開發還是很新的,以防它不明顯。

回答

2

由於您需要定義委託協議(IMO的一個好東西)的麻煩,您應該堅持您的設計決策,並將該屬性添加到協議中,而不是尋找一種使警告消失的「巧妙」解決方案遠。您可以使用@property的協議的聲明,就像這樣:

@protocol secondViewDelegate 
@property(retain) NSString* name; 
@end 

如果它不」感覺非常好,在你的協議中的財產,那麼你或許應該檢查你的設計決定:什麼是secondViewDelegate應該做的,或爲什麼secondView需要設置屬性。

+0

沒錯,就是這樣!當我們處理它時,我可以在沒有委託協議的情況下執行此操作嗎?第二個視圖可以調用'[self dismissModalViewControllerAnimated:YES];',而不是在baseView中調用它? – jpimentel 2012-02-17 11:47:11

+0

@ jpimentel:我不認爲這是可能的,視頻管理員誰提出也必須解僱。但這是一件好事,因爲它將責任保持在一個班級中。但是你可以重新設計你的協議,使它由帶有簽名'secondView:(secondView *)控制器didFinishWithName:(NSString *)名稱'的單一方法組成。 – herzbube 2012-02-17 21:31:05

0

你可以簡單地調用它的-name或-setName:方法,雖然會導致編譯器警告,但它們會起作用。 編輯:如果您將對象轉換爲適當的類型,它甚至不會發出警告。

+0

是的,它確實如此。但編譯器警告通常會告訴我「你不應該這樣做」。 – jpimentel 2012-02-16 20:05:37

+0

通常,但不是每次。 Obj-C的動態性質就是這裏的問題。編譯器只提示特定的類/對象響應哪些方法。這就是爲什麼這是一個警告,而不是一個錯誤。你有沒有用CFLAGS = -Wall從源代碼編譯出很酷的Unix編碼?你看到了很多警告? – 2012-02-16 20:46:35

+0

@ H2CO3:所以你會建議通過一個接口(或協議,因爲我們正在說Obj-C)來訪問一個屬性,而不是接口的一部分,只是因爲語言讓你脫離它在運行時? – herzbube 2012-02-16 21:03:28