2010-09-30 27 views
0

在我的iPhone項目中,我有一個UIViewController,我在其中添加了UIView子類的一個實例。從這個實例中,我需要傳回一個整數給我的視圖控制器。我目前的解決方案是從我的實例發送一條消息到我的App Delegate,它將消息發送到視圖控制器。它有效,但感覺有點混亂。運行時創建的子視圖如何與視圖控制器進行通信?

無論如何,我可以直接發回消息到視圖控制器?

我希望能夠做一些像[super doSomething:123];

任何想法?

謝謝

回答

2

這是NSNotificationCenter提供的那種東西。一旦你發送和接收通知得心應手,你的消息傳遞就會變得更簡單。

人們面對的經典事情之一就是如何獲得他們想要的對象的指針,以便告訴它某件事。例如,我如何告訴ViewController兩個插槽備份用戶剛更改此數據字段的UINavigationController堆棧?因此,您可以深入堆棧,並通過堆棧中的某些魔法元素抵消,在想要與之交談的字段上構建公共設置器......這非常麻煩。

與在一個地方註冊爲通知接收者,然後在數據改變時在某個完整的其他地方發出通知相比。在完成所有「挖掘視圖層次」工作之後,這有點神奇。

+0

謝謝丹。我明天會研究它。猜猜它與iOS 4中處理多任務處理的通知類似?當我嘗試過它時會回來。 – Structurer 2010-09-30 14:45:31

+0

通知調用方法相對較慢。它創建了一個非正式的鏈接,當有人看到代碼時,這些鏈接很容易被人遺忘或很難發現。像圖案這樣的代表更快,更直接。 – bbum 2010-09-30 16:03:15

+0

問題的意見,我猜@bbum。我發現從開發者的角度來看,通知方法更容易理解。我寧願展示一個新的Cocoa開發人員如何使用NSNotificationCenter,而不是如何構建委託界面。 – 2010-09-30 17:18:54

1

嗯,我不知道我是否正確理解你的問題。你有一個派生自UIView的類,它需要將消息發送給從UIViewController派生的另一個類。這聽起來像你正在編程創建UIView實例。是否有任何理由我不能在UIView上擁有一個引用UIVIewController的屬性,並直接使用它來發送消息。

你不能使用[super ...],因爲你的UIView派生類的超類將是UIView。

還是我錯過認識:-)

+0

嗨德里克。正如你正確地得到它,我以編程方式從我的視圖控制器添加視圖。我有一些屬性可以讀取,但我目前沒有任何可以捕獲屬性更改的循環(計時器驅動程序)。想想我會嘗試挖掘丹的回覆,但感謝超級解釋。 – Structurer 2010-09-30 14:41:51

+0

嗯,只是一個想法,但我正在閱讀關於NSNotification和使用通知來允許對象跟蹤其他對象的變化。我還沒有使用它,但它可能是有幫助的。做一個谷歌搜索NSNotification和一些文章將彈出有關使用通知。 – drekka 2010-10-01 02:18:44

+0

啊,我只是向下滾動閱讀Dan的帖子:-) – drekka 2010-10-01 02:20:06

0

問題只是一個出口添加到您的UIView子類,它連接到在Interface Builder的視圖控制器,並打電話給你的那個方法。以下是如何可能看:

MyUIView.h:

@interface MyUIView : UIView 
{ 
    UIViewController *viewController; 
} 
@property (assign) IBOutlet UIViewController *viewController; 
@end 

MyUIView.m:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [[self viewController] setTitle:@"Hello from MyUIView"]; 
} 
+0

視圖的超級視圖不太可能成爲'UIViewController',因爲這不是視圖。 – 2010-09-30 08:40:45

+0

哈哈,好點。看起來我並沒有很好地思考它。我將刪除該部分,所以這個答案仍然有些用處。 – 2010-09-30 09:06:29

+0

這個答案其實是正確的,雖然缺乏細節。 – bbum 2010-09-30 16:12:36

1

如果我理解正確的話,你想從你的子類發送消息的UIView到視圖控制器。

這意味着您的UIView的子類需要具有視圖控制器的屬性或ivar。最簡單的方法是將其添加爲插座並將其連接到nib文件中的視圖控制器。

+0

謝謝傑里米,但我以編程方式添加視圖,沒有筆尖。 – Structurer 2010-09-30 14:42:47

+0

你不需要一個筆尖來建立對象之間的連接。任何可以在IB中完成的事情都可以在代碼中完成。 – bbum 2010-09-30 16:15:46

0

通常,您不應該通過應用程序代理。有一個類型指針鏈接也不太理想。

溝通的最佳方式 - 蘋果也這樣做 - 是創建一個委託協議。在創建視圖控制器時,您將一個指向委託的指針作爲id傳遞。然後,當它到達發送消息你問代表:

if ([delegate respondsToSelector(didFinishSomething:)]) 
{ 
    [delegate didFinishSomething:info_to_pass]; 
} 

如果你想成爲超精密那麼你也可以一個指針到調用的類實例。像:

[delegate myViewController:self didFinishSomething:info_to_pass]; 

這樣你總是知道什麼類的消息來自。

如果有多個地點需要通知變更,則代替委派您將使用通知。

+0

Hi Dr Touch。任何原因,我不應該通過應用程序委託(更多的是明顯的額外代碼和意大利麪條鏈接...)。 – Structurer 2010-09-30 14:46:57

0

在我的iPhone項目我有一個 的UIViewController我在其中添加的UIView的子類的實例 。

這意味着你有同一個範圍內的UIView子類和UIViewController的實例的引用。即東西等同於:

UIViewControllerSubclass *myViewController; 
UIViewSubclass *myView; 

而一旦這兩個變量初始化,地方你這樣做(這不一樣,如果他們實際上是實例變量,或者甚至,全局關係)

myViewController.view = myView; 

在你UIViewSubclass,添加指向回你UIViewControllerSubclass屬性:

@property(assign) UIViewControllerSubclass *myController; 

然後,當你做到以上任務,添加:

myView.myController = myViewController; 

從那裏,從您的視圖短信控制器很簡單:

[self.myController yoManHereIsAnInt: 42]; 

請注意,我用assign代替retain因爲控制器已經保留了這個觀點。如果視圖也保留了控制器,那麼最終會導致泄漏。


沒有super關於它。 super與您的Objective-C類的繼承層次完全相關。你所要求的與繼承無關,以及與你的應用程序中的各種對象實例如何連接在一起的一切。

+0

你好。對不起,以錯誤的方式使用超級。我想我可以表達它像[父母doSomething:123]。我所擁有的不完全是你上面所描述的。我在視圖控制器(因此是「父」)內創建了我的子類的實例。我在視圖控制器中需要它,因爲視圖控制器管理什麼時候,何處以及什麼「級別」(bringSubviewToFront)應該顯示。但是我從你的答案中學到了一些新東西,非常感謝! – Structurer 2010-10-01 02:07:15

相關問題