2011-11-10 22 views
3

我已經嘗試了來自其他帖子的各種建議,但仍然無法正常工作。如何從自定義對象訪問mainViewController方法?

這是我的工作流程。

AppDelegate.m 
#import CustomObject.h  // cocoaAsyncSocket wrapper with delegates 

    - create customObject[[alloc] init]; 


mainViewController.m 
- (IBAction)connectDisconnect 
{ 
    // Access our custom object inside the TPAppDelegate class object. 
    TPAppDelegate *appDelegate = (TPAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [appDelegate.customObject connectToIP:host port:port timeout:10.0]; 


customObject.m 
#import mainViewController.h 

    // custom object delegate 
    - (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 
    { 
     // Access methods and properties inside 'mainViewController' class object. 
     mainViewController *mainView = (mainViewController *)[UIApplication sharedApplication]; 

     // call method 
     [mainView textViewLog:@"Hello"]; 
     . 
     . 
    } 



    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIApplication textViewLog:]: unrecognized selector sent to instance 0x188750' 

目標是讓我的customObject調用mainViewController中的方法。

我錯過了什麼? 或者我是否完全錯誤?

+0

爲什麼不使用一個通知,告訴什麼每個對象都列出了需要更新? ['NSnotificationCenter'](http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html) – rckoenes

回答

3

當你問[UIApplication sharedApplication]在這一行

mainViewController *mainView = (mainViewController *)[UIApplication sharedApplication]; 

你有UIApplication的實例。這不是一個mainViewController

在這裏我看到了幾個解決方案:

  1. 通指針你mainViewController到方法customObject
  2. 實現委託模式:定義CustomObjectDelegate協議,委託屬性添加到CustomObject,設置mainViewController爲代表,工作,來自CustomObject的mainViewController與它委託一樣。
  3. 如果CustomObject已經用於別的東西,比你能創建委託的模擬(例如,作爲UITableView的具有委託和數據源)委託
  4. 創建您的應用程序委託類的一些屬性(即mainViewController),並設置mainViewController它。比從任何地方你可以要求應用程序代理作爲[[UIApplication sharedApplication] delegate]並得到您的mainViewController[[[UIApplication sharedApplication] delegate] mainViewController]
+0

我剛剛實現了#4。 :)良好的選項列表。謝謝。對於哪一種也被認爲是「最佳實踐」,是否有偏好? –

0

您可以通過創建一個協議和委託方法

首先創建對象做到這一點mainView然後創建customObject的實例
創建一個並在customObject類和創建customObject設定的委託作爲mainView後實現它。
mainView中實現協議方法,然後您可以調用customObject中的協議方法,該方法將調用mainView中的委託方法。
從委託方法mainView可以調用屬於mainView

在代碼中的任何方法,
這條線有問題:

mainViewController *mainView = (mainViewController *)[UIApplication sharedApplication]; 

[UIApplication的sharedApplication]不會給你任何控制器。

sharedApplication 返回單例應用程序實例。

  • (UIApplication的*)sharedApplication

返回值 的應用實例在UIApplicationMain函數創建。

相關問題