如何从自定义对象访问mainViewController方法?

时间:2011-11-10 15:39:13

标签: iphone cocoa-touch

我已尝试过其他帖子中的各种建议,但仍然无法使其正常运行。

这是我的工作流程。

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中调用一个方法。

我错过了什么? 还是我完全错了?

3 个答案:

答案 0 :(得分:3)

当您在此行中询问[UIApplication sharedApplication]

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

你有UIApplication实例。 Ofcource它不是mainViewController

我在这里看到一些解决方案:

  1. 将指向mainViewController的指针传递给customObject
  2. 中的方法
  3. 实现委托模式:定义CustomObjectDelegate协议,将委托属性添加到CustomObject,将mainViewController设置为委托,与CustomObject一起使用mainViewController,就像委托一样。
  4. 如果委托已在CustomObject中用于其他内容,则可以创建委托的模拟(例如,UITableView具有委托和dataSource)
  5. 在应用程序委托类中创建一些属性(即mainViewController)并将mainViewController设置为它。您可以在任何地方向申请代表询问[[UIApplication sharedApplication] delegate]并获取mainViewController [[[UIApplication sharedApplication] delegate] mainViewController]之类的内容。

答案 1 :(得分:0)

您可以通过创建协议和委托方法来实现此目的

首先创建mainView的对象,然后创建customObject的实例
创建protocol并在customObject班级中实施,并在创建customObject后将代理设置为mainView
mainView中实现协议方法,然后您可以调用customObject中的协议方法,该方法将调用mainView中的委托方法。
mainView中的委托方法,您可以调用属于mainView的任何方法

在你的代码中,
这一行存在问题:

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

[UIApplication sharedApplication];没有给你任何控制器。

sharedApplication 返回单例应用程序实例。

  • (UIApplication *)sharedApplication

返回值 应用程序实例在UIApplicationMain函数中创建。

答案 2 :(得分:0)

我成功使用的另一种方法是来自:

的UIKitCategories方法

Get to UIViewController from UIView? enter link description here