0

storyboardを使用して UITableViewController を作成し、デバイスを検出するたびにテーブルビューをリロードしたい (bonjour プロトコルの場合)。ただし、リロード データ メソッドは numberofRows のみを呼び出し、CellForRowatIndexPath を呼び出しません。だから私は何も変わっていません。チェックした mutablearray は常に正しく動作しています。NewObjects が追加されます。しかし、テーブルビューは配列で変わりません。ですから、ここで sth を間違って設定したのではないかと思っています。

追加した NSLog から、最初に初期化された配列でテーブルビューをロードできることがわかりました

 self.serviceArray = [[NSMutableArray alloc]initWithObjects:@"test", nil];

しかしその方法では

 - (void)addService:(NSNetService *)....

リロードするたびに、新しいオブジェクトを mutableArray に追加できますが、テーブルビューは配列で変更されません。(numberOfRowsを呼び出し、返された配列サイズが0でないことを確認しましたが、cellOfRowAtIndexを呼び出しません)

これが私のコードです

.h ファイル

   #import <UIKit/UIKit.h>
   #import "Server.h"
   @interface BrowserViewController : UITableViewController <ServerDelegate>
    {
       Server *_server;
       NSMutableArray *_serviceArray;
    }

   @property (retain,nonatomic) NSMutableArray *serviceArray;
   @property (nonatomic,retain) Server *server;


   - (void)addService:(NSNetService *)service moreComing:(BOOL)more;
   @end

.m ファイル

   #import "BrowserViewController.h"
   @implementation BrowserViewController
   @synthesize serviceArray = _serviceArray;
   @synthesize server = _server;

   - (void) dealloc
   {
       [self.serviceArray release];
       [self.tableView release];
       [super dealloc];

    }



   - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:YES];
        self.title = @"Service Browser";


        _serviceArray = nil;
        self.serviceArray = nil;

        [self.tableView setDelegate: self];
        [self.tableView setDataSource:self];  
        //actually I set this in the storyboard already

        [self.tableView reloadData];

    }

    - (void)viewWillDisappear:(BOOL)animated 
    {
        [super viewWillDisappear:animated];
        _serviceArray = nil;
        NSLog(@"viewwilldisappear");
    }

    - (NSMutableArray *)serviceArray {

      if(nil == _serviceArray) {
         self.serviceArray = [[NSMutableArray alloc]initWithObjects:@"test", nil];
    }
      else
    {
        NSLog(@"update array");
    }

    return _serviceArray;

    }

   - (void)didReceiveMemoryWarning
   {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
   }


   - (void)addService:(NSNetService *)service moreComing:(BOOL)more{

    [self.serviceArray addObject:service];

    if (!more) {
        [self.tableView reloadData];
         }
    }

   #pragma mark - Table view data source



  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  {
      return 1;
   }

  - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return @"Connection Choices";
    }


  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [self.serviceArray count];

     }

     - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
     {

       static NSString *CellIdentifier = @"Cell";
       UITableViewCell *Cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

       if (Cell == nil) {
            Cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]autorelease];
        }

       NSString *text = [self.serviceArray objectAtIndex:indexPath.row];

       Cell.textLabel.text = text;

       return Cell;
       }

       @end

いくつかの解決策を確認しました。デリゲート設定の問題であるか、配列が null です。またはスペースなしで初期化されたセル。メソッドのデリゲートを確認する方法はありますか?

また、IBOutlet にリンクされた .h ファイルに tableview プロパティを作成してから、.m ファイルに合成しようとしました。しかし、まだ機能しません。誰でも私を助けることができますか?

多くのチュートリアルはウィンドウベースのアプリケーションに基づいているため、誰かがストーリーボードと reloadData を使用したチュートリアルを提供してくれませんか? アウトレットが間違っているかどうかを確認できました。

前もって感謝します。

UPDATE1 AddService メソッドは appDelegate で呼び出されます

appDelegate.h

 #import <UIKit/UIKit.h>
 #import "Server.h"

 @class BrowserViewController;

 @interface iphoneNetworkAppDelegate : NSObject <UIApplicationDelegate,UITableViewDataSource, UITableViewDelegate, ServerDelegate>
{
    Server *_server;
    UIWindow *window;
    IBOutlet BrowserViewController *BrowserVC;

}
@property (strong, nonatomic) UIWindow *window;


@end

appDelegate.m

#import "iphoneNetworkAppDelegate.h"
#import "BrowserViewController.h"

@implementation iphoneNetworkAppDelegate
@synthesize window;


- (void)dealloc
{
[window release];


[_server release];
_server = nil;
[BrowserVC release];
BrowserVC = nil;
[super dealloc];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

NSString *type = @"TestingProtocol";
_server = [[Server alloc] initWithProtocol:type];
_server.delegate = self;
NSError *error = nil;
if(![_server start:&error]) {
    NSLog(@"error = %@", error);
}

BrowserVC = [BrowserViewController alloc];
if (BrowserVC == nil) {
    NSLog(@"need to init");
}
BrowserVC.server = _server;


return YES;
}



#pragma mark Server Delegate Methods

- (void)serverRemoteConnectionComplete:(Server *)server {
NSLog(@"Server Started");

BrowserVC.server = server;

}

- (void)serverStopped:(Server *)server {
NSLog(@"Server stopped");
}

- (void)server:(Server *)server didNotStart:(NSDictionary *)errorDict {
NSLog(@"Server did not start %@", errorDict);
}

- (void)server:(Server *)server didAcceptData:(NSData *)data {
NSLog(@"Server did accept data %@", data);

}

- (void)server:(Server *)server lostConnection:(NSDictionary *)errorDict {
NSLog(@"Server lost connection %@", errorDict);

}

- (void)serviceAdded:(NSNetService *)service moreComing:(BOOL)more {

NSLog(@"service added in delegate");

[BrowserVC addService:service moreComing:more];
}


#pragma mark -

- (void)applicationWillTerminate:(UIApplication *)application {
[_server stop];
[_server stopBrowser];
}

appDelegateの設定がこうだとreloadDataが呼び出せない?

4

2 に答える 2

0
  1. ビューに次の行が表示される必要はないと思います

    _serviceArray = nil; self.serviceArray = nil;

  2. また、関数 addService が呼び出されたことを確認します。

于 2013-05-07T11:30:18.537 に答える