0

同様の質問の投稿 (これは機能しません) に続いて、AppDelegate.h で GCDAsyncSocket のインスタンスを宣言しました。

#import <UIKit/UIKit.h>

@class ViewController;
@class GCDAsyncSocket;

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    GCDAsyncSocket *asyncSocket;

}

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, retain) GCDAsyncSocket *asyncSocket;
@property (strong, nonatomic) ViewController *viewController;

@end

AppDelegate.m でソケットの初期化を行います。

#import "AppDelegate.h"
#import "GCDAsyncSocket.h"
#import "ViewController.h"

@implementation AppDelegate
@synthesize asyncSocket;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];

    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    self.asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:mainQueue];
    NSString *host = @"10.1.100.50";
    uint16_t port = 3040;

    NSError *error = nil;
    if (![self.asyncSocket connectToHost:host onPort:port error:&error])
    {
        NSLog(@"Error connecting: %@", error);
    }

    char bytes[] = "run";
    NSData* requestData = [[NSData alloc] initWithBytes:bytes length:sizeof(bytes)];
    [self.asyncSocket writeData:requestData withTimeout:-1 tag:0];
    return YES;
}

次を呼び出して、複数のView Controllerからソケットにアクセスしようとしました:

GCDAsyncSocket *asyncSocket = [[[UIApplication sharedApplication] delegate] asyncSocket];

コード補完は、asyncSocket を提案できずに [[UIApplication sharedApplication] delegate] で停止します。asyncSocket のインスタンスが AppDelegate で宣言されている場合、複数のビュー コントローラーで asyncSocket にアクセスできるようにするにはどうすればよいですか? ありがとう!

これが私のXcodeプロジェクトファイルです: http://bit.ly/PLe1Le

4

1 に答える 1

2

あなたは正しい軌道に乗っています。また、アプリケーション デリゲートは、ソケット接続に最適な場所です。比較的単純なことでつまずいていると思います。

[[UIApplication sharedApplication] delegate]プロトコルidに準拠するオブジェクトへのまたはジェネリック オブジェクト ポインタを返します。したがって、コード補完には、アプリケーションのデリゲートがクラスのインスタンスであること<UIApplicationDelegate>知る方法がありません。 AppDelegate

AppDelegate実際に のインスタンスをアプリケーションのデリゲートとして使用している場合、 はデリゲート[[UIApplication sharedApplication] delegate]へのポインターを返しますが、それは上記で説明した汎用ポインターになります。

最も簡単な解決策は、受け取る[[UIApplication sharedApplication] delegate]ポインターをAppDelegate型のポインターにキャストすることです。

例えば:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
// We now have a pointer to your app delegate that the compiler knows is an AppDelegate.
// So code completion will work and it will compile.
GCDAsyncSocket *socket = [myAppDelegate asyncSocket];

または、呼び出しを 1 つのステートメントにスタックすることもできます。構文は少し奇妙に見えますが、これがどのように行われるかです。

GCDAsyncSocket *socket = [(AppDelegate *)[[UIApplication sharedApplication] delegate] asyncSocket];
于 2012-08-30T17:03:08.567 に答える