0

UITabBarControllerを使用してアプリを開発しています。具体的には、storyBoardを使用します。すべてのタブでサーバーとデータを送受信できるようにしたいと思います。

問題は、方法がわからないことです。サーバーとの間で送受信できるのは、initNetworkCommunicationsを持つ最初のタブのみです。では、アプリが他のタブと送受信できるようにするには、どうすればよいですか?

NSNotificationCentreを使用してデータを処理することは機能することがわかりましたが、別の方法はありますか?

ソケット接続を作成するためのコードは次のとおりです

-(void)initNetworkCommunication
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"169.254.1.1", 2000, &readStream, &writeStream);

inputStream = (NSInputStream *)readStream;
outputStream = (NSOutputStream *)writeStream;

[inputStream setDelegate:self];
[outputStream setDelegate:self];

[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

[inputStream open];
[outputStream open];

}

2つのタブがあるとしましょう。最初のタブには、initNetworkCommunicationを呼び出すために使用される接続ボタンがあります。このタブから、データを送受信できます。しかし、他のタブで何をしますか?この接続をリンクする方法はありますか?

お互いのコントローラーをインポートして[FirstControllersendMessage]を使用しようとしました。secondViewControllerからですが、機能していないようです。

4

2 に答える 2

2

シングルトンの作成は問題ありません。私が行ったことは、クラス関数を作成する代わりに (タブを切り替えるたびにネットワークに接続の再初期化を強制することになります)、networkconnector を tabBar のカスタム実装のプロパティにします。

#import <Foundation/Foundation.h>
#import "NetworkController.h"

@interface NetworkStorageTabBarController : UITabBarController
@property (nonatomic, strong) NetworkController *thisNetworkController;
@end

そして実装ファイル:

#import "NetworkStorageTabBarController.h"

@implementation NetworkStorageTabBarController
@synthesize thisNetworkController;
@end

次に、タブ付きビューをロードするときに、表示される最初のビューの viewWillAppear でこれを呼び出します。

//set up networking
NetworkStorageTabBarController *thisTabBar = (NetworkStorageTabBarController *) self.tabBarController;
self.thisNetworkController = thisTabBar.thisNetworkController;
self.thisNetworkController.delegate = self;

これまでのところ、これは私にとって見事に機能しています。それを理解するのに永遠にかかったので、これが役立つことを願っています!

于 2012-12-09T18:17:45.427 に答える
0

最も簡単な方法は、Singleton を作成することです。それを NetworkCommunications と呼びましょう。

シングルトンにするには (インスタンスは 1 つだけ作成されます):

+(NetworkCommunications *)sharedManager {
    static dispatch_once_t pred;
    static NetworkCommunications *shared = nil;

    dispatch_once(&pred, ^{
        shared = [[NetworkCommunications alloc] init];
    });
    return shared;
}

次に、タブから [NetworkCommunications sharedManager] を呼び出すだけで、その単一のインスタンスにアクセスできます。

そのインスタンスにもネットワーク コードを配置します。

于 2012-09-03T08:53:57.590 に答える